Android 通过调用startService向服务发送消息
我已经创建了一个服务,并使用Android 通过调用startService向服务发送消息,android,android-service,Android,Android Service,我已经创建了一个服务,并使用bindService功能通过我的活动访问它,但我想在活动退出后继续运行我的服务 为此,我必须使用startService,但之前我使用了bindService和ServiceConnection,在调用onServiceConnected后,我将消息发送给处理程序(在服务中) 但是我不知道如何使用startService发送消息,因为我没有像onServiceConnected这样的地方将消息发送给处理程序 注意:当我从我的服务更新小部件时,即使我的应用程序用完了,
bindService
功能通过我的活动访问它,但我想在活动退出后继续运行我的服务
为此,我必须使用startService
,但之前我使用了bindService
和ServiceConnection
,在调用onServiceConnected
后,我将消息发送给处理程序(在服务中)
但是我不知道如何使用startService
发送消息,因为我没有像onServiceConnected
这样的地方将消息发送给处理程序
注意:当我从我的服务更新小部件时,即使我的应用程序用完了,我也希望继续运行我的服务
因此,服务有两个角色
更新活动内部的文本视图
一旦活动退出,服务将更新小部件
除了绑定到服务之外,没有其他方式与服务通信。在活动中绑定服务并不一定意味着服务将(或需要)从服务的存储中取消绑定。如果不调用unbindService方法,则绑定的服务将始终运行。因此,解决方案是绑定到服务,而不调用活动的unbindService onDestroy。您有3个选项可以与服务通信:
- 在意向书中添加一个额外的内容,并致电startService。你可以叫它
多次,即使服务已在运行
- 创建Messenger并使用它与服务通信
- 使用bindService
请确保在您的服务中使用START\u STICKY
,使其在活动结束后继续运行,并使用startForeground()
显示通知,否则您的服务将在一段时间后(平均30分钟到1小时)被so终止
启动流量:
- ClientActivity(CA)启动服务并将CA Messenger地址作为附加地址发送到服务李>
- 服务启动时,它会将service Messenger地址发送回
CA(使用CA Messenger地址发送消息)
- 最后,服务返回START\u STICKY
通过这两种方式,客户端和服务器将相互了解Messenger地址,无需绑定
停止服务:
要停止服务,请在活动中使用以下命令:
stopService(new Intent(ActivityClass.this, ServiceClass.class));
重新连接:
如果您离开clieant活动(CA)并希望在应用程序重新启动时重新连接到服务,您有两个选项:
-从您的CA再次调用startService。这将再次调用服务中的onStartCommand
。仅当服务尚未运行时才会调用服务onCreate()
。您可以使用上述启动流获取service Messenger
-您可以将service Messenger设置为公共和静态公共静态Messenger mMsgService=null代码>。因此,当CA启动时,它可以检查service messenger是否已初始化(非空),并使用它与服务通信。当setvice停止时,需要设置mMsgService=null代码>
祝你好运。你是如何启动服务的,我的意思是你可能正在使用启动服务的意图?是的,因为我想在后台继续运行,所以我正在使用startService
好的,那么你有什么想要发送给你的服务吗?你们可以通过你们用来启动服务的相同目的发送它。你试过了吗?哦!很抱歉我想我只是误解了你的问题..如果我不解除绑定,我会得到服务泄漏异常吗
不,如果你用Application Context启动服务,即使我通过这个.getApplicationContext()你也不会得到它
我确实得到了android.app.ServiceConnection泄漏:Activity com.ha.home.MyActivity
已泄漏ServiceConnection com.ha.home.MyActivity$1@448163e8
最初绑定在这里,因为我正在使用Messenger
注册客户端并获取值,所以第一个选项不起作用。但要向服务发送消息并在活动中接收消息,我需要使用bindService
,但当我存在时,我需要unBindService
,服务停止当您启动服务时,您可以将客户端信使地址作为附加地址发送到服务。在服务启动时,您将service Messenger地址发送回客户端(使用客户端Messenger地址发送消息)。最后,从servicestart返回START\u STICKY以保持其运行。有了这两个,,客户端和服务器将相互知道对方的Messenger地址,无需绑定。我尝试了您的方法,但在我离开活动并返回应用程序后,我丢失了service Messenger地址,因此无法停止服务。我尝试在返回活动后呼叫stopService
停止服务这是第二次,但服务没有停止以停止服务使用:stopService(newintent(ActivityClass.this,ServiceClass.class))。我在几个应用程序中使用它,没有任何问题。