我已根据本教程使用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中运行的计数器)但在运行服务的列表中它不存在。
我想知道该服务是否正在运行。如果它正在运行,那么我想将应用程序绑定到现有服务。如果没有,则应启动新服务。
公共类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;
}
}
现在我的问题:为什么我的服务不在运行服务?我是否可以绑定到服务,即使它不在正在运行的服务集合中?
答案 0 :(得分:2)
我只是想说,在我的设备上,您所说的用于告知服务是否正在运行的方法不起作用(它将始终返回false)。我知道,我为我的一个服务尝试过同样的事情。在getRunningServices()方法的文档中,声明它实际上不应被应用程序使用。
另外,我根据你的故事得出的结论是,服务可能会被停止/杀死,但它的进程仍然存在,因为它启动的线程仍然存活并正常工作。所以你可能是对的,服务停止了,但线程依然存在。你在任何代码中使用stopService()或unbindService()吗?如果在绑定之前没有调用startService(),则服务将在其所有客户端调用unbindService()之后停止...