2

我根据本教程创建了一个带有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 { 私有静态字符串 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;
 }

}

现在我的问题是:为什么我的服务不在运行服务中?即使它不在正在运行的服务集合中,我也可以绑定到服务吗?

4

1 回答 1

2

我只想说,在我的设备上,你所说的告诉服务是否正在运行的方法不起作用(它总是会返回 false)。我知道,我为我的一项服务尝试了同样的事情。在getRunningServices()方法的文档中,它声明它实际上不应该被应用程序使用。

此外,根据您的故事,我得出的结论是,服务可能确实被停止/杀死,但它的进程仍然存在,因为它启动的线程仍然存在并且正在工作。所以你可能是对的,服务停止了,但线程仍然存在。您是否在任何代码中使用 stopService() 或 unbindService() ?如果在绑定之前没有调用 startService(),则服务将在其所有客户端调用 unbindService() 后停止...

于 2013-06-20T15:41:19.727 回答