web-dev-qa-db-ja.com

Android:バックグラウンドプロセスとして個別に実行されているサービスを完全に強制終了するにはどうすればよいですか?

通常のGUIとして使用されるアクティビティとサービスを備えたアプリがあります。私のアクティビティには2つのボタンがあります。プロセスを停止するための1つのボタンと、プロセスを強制終了するための1つのボタン。これらをそれぞれメソッドに使用して、プロセスを開始および停止します。

_Intent i = null;
Button start;
Button stop;

public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    i = new Intent(this, Service.class);
    start = (Button) findViewbyId(R.id.start_button);
    stop = (Button) findViewById(R.id.stop_button);

    start.setOnClickListener(new OnClickListener(){

        public void onClick(){
            startService(i);
        }
    }
    stop.setOnClickListener(new OnClickListener(){

        public void onClick(){
            stopService(i);
        }
    }
}
_

このサービスは、活動またはアプリに拘束されません。マニフェストで次のようにサービスを構成しています。

_<service
    Android:name="com.example.mypackage.Service"
    Android:process=":remote"> 
    <intent-filter>
        <action
            Android:name="com.example.mypackage.Service" />
    </intent-filter>
</service>
_

私がサービスを開始すると、それは他のものから独立してそれ自身で実行されます。つまり、サービスを開始してアプリをonDestroy()しても、サービスはまだ実行されています。 adbを介してpsコマンドを実行すると、実行されていることがわかります。

問題は、stopService(intent)を呼び出すときです。アクティビティ側からstopService(intent)を呼び出すと、サービスのonDestroy()に設定されているコード行が実行されますが、psからadb、それはまだ実行中であると言います。

サービスを完全に破壊できるようにしたい。サービスの仕組みがよくわかりませんので、お気軽にご相談ください。それが私がサービス内で行っていることと関係があるのか​​どうかはわかりません。ありがとう!

編集: サービスを開始するときは、onStartCommand()を使用して、そこで実行するコードを実行します。また、onStartCommand()から_START_STICKY_を返します。また、_START_NOT_STICKY_を返そうとしましたが、startService(intent)を呼び出した後もサービスは実行されています。

10
Rob Avery IV

サービスプロセスを強制的に強制終了する場合は、次のコードを使用できます。

Process.killProcess(Process.myPid());
6
Chari D

StopServiceが呼び出された後、サービスは停止されます。停止後、それらは非アクティブですが、キャッシュされます。

Androidドキュメントによって 空のプロセス

アクティブなアプリケーションコンポーネントを保持しないプロセス。この種のプロセスを存続させる唯一の理由は、キャッシュの目的で、次にコンポーネントを実行する必要があるときの起動時間を改善するためです。システムは、プロセスキャッシュと基盤となるカーネルキャッシュの間でシステムリソース全体のバランスを取るために、これらのプロセスを強制終了することがよくあります。

サービスは、アプリによって再度呼び出されるか、システムキャッシュに保持する余地がなくなるまで、キャッシュに残ります。 RSコマンドは、アクティブなdprocessとキャッシュdprocessの違いを認識せず、常にすべての使用可能なプロセスを表示します。 :remoteを削除しても、この動作は維持されます(個別のプロセスは作成されないことに注意してください)

5
Yarh