我正在阅读文档,我花的时间越多,我就越困惑,什么是完成我想要做的事情的最简单的方法。我想编写一个简单的服务,它从按钮onClick开始并绑定到活动。当活动关闭并稍后重新启动时(不仅仅是重新启动!),我想检查服务是否已经在运行并绑定到它。我该怎么做呢?
谢谢
发布于 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()返回时完成。“
您可以检查服务是否正在运行:
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;
}发布于 2011-08-23 18:33:37
在这种情况下,我认为您只需要使用AsyncTask,希望这会有所帮助
发布于 2011-08-23 18:37:51
要在android中执行服务到活动的实际绑定,您需要扩展Service类并将服务绑定到您的activity (可能还需要使用Android的AIDL来执行activity和服务之间的通信)。然而,在您的示例中,听起来您只需在活动中使用单独的线程就可以了。使用runnable或AsyncTask。用户单击触发onClick的按钮后,将应用程序中的静态布尔值设置为true。然后,在重新进入活动时,只需检查布尔值是否为true,如果为true,则再次触发线程。
https://stackoverflow.com/questions/7159604
复制相似问题