実行中のサービスを止める方法

一度動いたService(サービス)が止まるのはシステムのメモリがいっぱいになった時やエラーが起こった時などにシステムから強制的にストップされた時です。

しかし、一度止まったとしてもサービスなのでしばらくするとまた動き出します。

このような仕組みはとても便利ですが不要になったサービスは外部またはサービス内部から止めてあげないとアプリがメモリを圧迫してシステムの能力を低下させる原因になることがあります。

そこで次の2つの方法でサービスを止めることが可能です。

サービス外で止める方法

まず1つめのサービスの外でサービスを止める方法を紹介します。サービスの外とは自分以外のサービスやActivityクラスのことを指しています。例えばActivityクラスなどで次のようにstopServiceメソッドを呼び出します。

public class MainActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        Button stopServiceButton = (Button)findViewById(R.id.stop_service_btn);
        stopServiceButton.setOnClickListener(new View.onClickListener()
        {
            public void onClick(View v)
            {
                Intent intent = new Intent(MainActivity.this, MyService.class);
                stopService(intent);
                    //MyServiceというサービスを停止する。
            }
        });
    }
}

やり方はActivityクラスなどで止めたいサービスへのインテントを渡すだけです。これで現在動いているサービスがストップします。

サービス内で止める方法

サービス内からでもstopSelfメソッドを呼び出すことで自分自身を止めることができます。たとえば次のような使い方をします。

public class MyService extends Service 
{
    @Override
    public void onStart(Intent intent, int startId)
    {
        new Timer().schedule(new TimerTask()
        {
            public void run()
            {
                stopSelf();
                Log.d("MyService : ", "サービス停止");
            }
        }, 5000);
            //5秒後にサービス停止
    }
    
    @Override
    public IBinder onBind(Intent intent) 
    {
        return null;
    }
}

この例のようにある処理(5秒間停止)をしたあとでもうサービスを使うことがないならstopSelfメソッドを呼び出せばサービスが終了します。

ただしAccessibilityServiceなど、停止させるのに設定画面を開かなければならないようなサービスの場合はstopSelfメソッドは効かないようです。

本当にサービスが止まったかどうか調べるには「Settings」(設定)アプリから「Apps」を選びその中の「RUNNING」(実行中)のリスト中にサービスがあるかどうかで判断することができます。

関連項目
プライバシーポリシー