このチュートリアルに基づいて、aidl を使用してリモート サービスを使用して Android アプリを作成しました。
http://www.anddev.org/remote_service_tutorial-t8127.html
サービスが実行中であることを示すカウンターを logcat に出力するようにサービスを変更しました。
class Task implements Runnable {
private final ResultReceiver receiver2;
public Task(ResultReceiver receiver) {
receiver2 = receiver;
}
public void run() {
while (true) {
++counter;
Bundle b = new Bundle();
try {
System.out.println("Server counter: " + counter);
// get some data or something
b.putInt("results", counter);
receiver2.send(STATUS_FINISHED, b);
} catch (Exception e) {
b.putString(Intent.EXTRA_TEXT, e.toString());
receiver2.send(STATUS_ERROR, b);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// serviceHandler.postDelayed(this, 1000L);
Log.i(getClass().getSimpleName(), "Incrementing counter in the run method");
}
}
}
メインアプリが停止してもサービスが実行され続けていることを確認したかったので、finish() を使用してアクティビティを「強制終了」しました。アクティビティがなくなっても、カウンターは引き続き logcat に出力されます。
アプリを再度開いたとき。開始ボタンをクリックし、次のコードを使用してサービスが実行されているかどうかを確認します (つまり、logcat で実行されているカウンターを確認できます)が、実行中のサービスのリストに存在しません。
サービスが実行されているかどうかを知りたい。実行中の場合は、アプリを既存のサービスにバインドします。そうでない場合は、新しいサービスを開始する必要があります。
public class ServiceTools { private static String LOG_TAG = ServiceTools.class.getName();
public static boolean isServiceRunning(Context context, String serviceClassName) {
final ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (RunningServiceInfo info : manager.getRunningServices(Integer.MAX_VALUE)) {
String name = info.service.getClassName();
if (name.equals(serviceClassName)) {
return true;
}
}
return false;
}
}
そして今、私の質問: 私のサービスが実行中のサービスにないのはなぜですか? サービスが実行中のサービス コレクションに含まれていなくても、サービスにバインドできますか?