首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android后台服务

Android后台服务
EN

Stack Overflow用户
提问于 2011-08-23 18:27:49
回答 3查看 8.4K关注 0票数 1

我正在阅读文档,我花的时间越多,我就越困惑,什么是完成我想要做的事情的最简单的方法。我想编写一个简单的服务,它从按钮onClick开始并绑定到活动。当活动关闭并稍后重新启动时(不仅仅是重新启动!),我想检查服务是否已经在运行并绑定到它。我该怎么做呢?

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-23 18:32:53

“如果你用startService(..)启动安卓服务该服务将一直运行,直到您显式调用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()返回时完成。“

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

代码语言:javascript
复制
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;
}
票数 12
EN

Stack Overflow用户

发布于 2011-08-23 18:33:37

在这种情况下,我认为您只需要使用AsyncTask,希望这会有所帮助

票数 1
EN

Stack Overflow用户

发布于 2011-08-23 18:37:51

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7159604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档