通常の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)
を呼び出した後もサービスは実行されています。
サービスプロセスを強制的に強制終了する場合は、次のコードを使用できます。
Process.killProcess(Process.myPid());
StopServiceが呼び出された後、サービスは停止されます。停止後、それらは非アクティブですが、キャッシュされます。
Androidドキュメントによって 空のプロセス :
アクティブなアプリケーションコンポーネントを保持しないプロセス。この種のプロセスを存続させる唯一の理由は、キャッシュの目的で、次にコンポーネントを実行する必要があるときの起動時間を改善するためです。システムは、プロセスキャッシュと基盤となるカーネルキャッシュの間でシステムリソース全体のバランスを取るために、これらのプロセスを強制終了することがよくあります。
サービスは、アプリによって再度呼び出されるか、システムキャッシュに保持する余地がなくなるまで、キャッシュに残ります。 RSコマンドは、アクティブなdprocessとキャッシュdprocessの違いを認識せず、常にすべての使用可能なプロセスを表示します。 :remote
を削除しても、この動作は維持されます(個別のプロセスは作成されないことに注意してください)