Android后台服务

时间:2011-08-23 10:27:49

标签: android service android-activity background bind

我正在阅读文档,而且我花费的时间越多,我就会越来越困惑,这是实现我想做的最简单的方法。我想写一个简单的服务,它从按钮onClick开始并绑定到活动。当活动关闭并稍后再次启动(不仅重新启动!)时,我想检查服务是否已经运行并绑定到它。我该怎么做?

由于

3 个答案:

答案 0 :(得分:12)

“如果你用startService(..)启动一个android服务,那么服务将一直运行,直到你明确地调用stopService(..)。系统可以运行服务有两个原因。如果有人调用Context。 startService()然后系统将检索服务(创建它并在需要时调用其onCreate()方法),然后使用客户端提供的参数调用其onStartCommand(Intent,int,int)方法。此时服务将继续运行,直到调用Context.stopService()或stopSelf()。注意,对Context.startService()的多次调用不会嵌套(尽管它们会导致多次对onStartCommand()的相应调用),所以无论多少次它启动后,一旦调用了Context.stopService()或stopSelf(),服务就会停止;但是,服务可以使用它们的stopSelf(int)方法来确保在处理完启动意图之前不停止服务。

客户端还可以使用Context.bindService()来获取与服务的持久连接。如果服务尚未运行(在执行此操作时调用onCreate()),这同样会创建服务,但不会调用onStartCommand()。客户端将接收服务从其onBind(Intent)方法返回的IBinder对象,允许客户端然后回调该服务。只要建立连接,服务将保持运行(客户端是否保留对服务的IBinder的引用)。通常,IBinder返回的是一个用aidl编写的复杂接口。

服务既可以启动,也可以绑定连接。在这种情况下,只要系统启动或者使用Context.BIND_AUTO_CREATE标志有一个或多个连接,系统就会保持服务运行。一旦这些情况都不成立,就会调用服务的onDestroy()方法并有效终止服务。从onDestroy()返回时,应完成所有清理(停止线程,取消注册接收器)。“

您可以检查服务是否正在运行:

public boolean isServiceRunning() {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if ("com.example.app.ServiceClassName".equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}

答案 1 :(得分:1)

在该场景中,我认为您只需要使用AsyncTask          希望这有帮助

答案 2 :(得分:0)

要对android中的活动执行服务的实际绑定,您需要扩展Service类并将服务绑定到您的活动(并且可能使用Android的AIDL来执行活动和服务之间的通信)。但是,在您的示例中,听起来您可以通过在活动中使用单独的线程来逃避。使用runnable或AsyncTask。一旦用户单击触发onClick的按钮,在应用程序中将静态布尔值设置为true。然后,在重新进入活动时,只需检查该布尔为true,如果为true,则再次触发该线程。