带有远程服务的Android应用

时间:2012-09-27 07:08:37

标签: java android service aidl

我已根据本教程使用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;
 }

}

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

1 个答案:

答案 0 :(得分:2)

我只是想说,在我的设备上,您所说的用于告知服务是否正在运行的方法不起作用(它将始终返回false)。我知道,我为我的一个服务尝试过同样的事情。在getRunningServices()方法的文档中,声明它实际上不应被应用程序使用。

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