MyService myService;
public ServiceConnection myConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
Log.d("ServiceConnection","connected");
myService = binder;
}
//binder comes from server to communicate with method's of
public void onServiceDisconnected(ComponentName className) {
Log.d("ServiceConnection","disconnected");
myService = null;
}
}
6 回答
“如果启动一个带有
startService(..)
的Android服务,服务将保持运行,直到您明确调用stopService(..)
. 系统可以运行服务有两个原因 . 如果有人调用Context.startService()
,那么系统将检索服务(创建它并调用它的onCreate()
方法(如果需要)然后用客户端提供的参数调用它的onStartCommand(Intent, int, int)
方法 . 此时服务将继续运行,直到Context.stopService()
或stopSelf()
被调用 . 注意多次调用Context.startService()
不会嵌套(尽管它们确实导致对onStartCommand()
的多次相应调用,因此无论启动多少次,一旦调用Context.stopService()
或stopSelf()
,服务将被停止;但是,服务可以使用它们的stopSelf(int)
方法来确保在处理启动的意图之前不停止服务 .客户端还可以使用
Context.bindService()
获取与服务的持久连接 . 如果服务尚未运行(在执行此操作时调用_2616630),这同样会创建服务,但不会调用onStartCommand()
. 客户端将收到服务从其onBind(Intent)
方法返回的IBinder
对象,允许客户端然后回拨服务 . 只要 Build 连接,服务将保持运行(无论客户端是否保留对服务的引用IBinder
) . 通常,IBinder
返回的是用AIDL编写的复杂接口 .服务既可以启动,也可以绑定连接 . 在这种情况下,只要系统启动或与
Context.BIND_AUTO_CREATE
标志有一个或多个连接,系统就会保持服务运行 . 一旦这些情况都不成立,就会调用服务的onDestroy()
方法,并且服务会被有效终止 . 从onDestroy()
返回时,应完成所有清理(停止线程,取消注册接收器) . “首先,我们需要了解的两件事
客户
这里
mServiceConn
是ServiceConnection
类(内置)的实例它实际上是我们需要用两个(第一个用于网络连接和第二个网络未连接)方法来监视网络连接状态的接口 .服务器
现在在客户端,如何访问服务器的所有方法?
现在如何调用服务中的方法
这里
myService
是对象,serviceMethode
是服务方法 . 通过这种方式,在客户端和服务器之间 Build 通信 .我试着打电话
因此,我可以创建一个粘性服务并绑定它 . Bound Service Example的详细教程 .
有一个名为unbindService的方法,它将采用您在调用bindService时创建的ServiceConnection . 这将允许您在保持运行的同时断开与服务的连接 .
当您再次连接它时,这可能会出现问题,因为当您再次启动活动时,您可能不知道它是否正在运行,因此您必须在活动代码中考虑这一点 .
祝好运!
这是一个有偏见的答案,但我写了一个可以简化Android服务使用的库,如果它们在与应用程序相同的进程中本地运行:https://github.com/germnix/acacia
基本上你定义了一个用@Service及其实现类注释的接口,并且库创建并绑定服务,处理连接和后台工作线程:
你可以得到一个实例关联android.app.Service以隐藏/显示持久性通知,使用您自己的android.app.Service并根据需要手动处理线程 .
如果用户退出,将调用
onDestroy()
方法 . 此方法用于停止应用程序中使用的任何服务 . 因此,如果您想要继续服务,即使用户退出应用程序,也只需删除onDestroy()
. 希望这有帮助 .