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))。我在几个应用程序中使用它,没有任何问题。