android:当应用程序处于非活动状态时如何从服务接收广播

时间:2016-11-04 06:16:55

标签: android service broadcastreceiver localbroadcastmanager

当我的服务正在运行并且我可以在屏幕上看到我的应用程序时,一切正常。我的服务发送广播消息,我可以在我的" MainActivity"中看到它们。但是一旦我按下主页按钮,我的应用程序不再在前台,它就会停止。该服务仍在运行,但广播不会到达我的死亡"或者"暂停"应用程序。这是我的代码:

  

主要活动:

onCreate:

    Intent intent = new Intent(getApplicationContext(), MainGate_Service.class);
    startService(intent);

@Override
protected void onStart() {
    super.onStart();

    LocalBroadcastManager.getInstance(this).registerReceiver(ServiceReceiver, new IntentFilter("MainGate_ring"));
}

@Override
protected void onStop() {
    super.onStop();

    LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);
}


private BroadcastReceiver ServiceReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {

        String message = intent.getStringExtra("ServiceMessage");

        if(message != null) {
            if(alarmActive && message.equals("ring"))
                new soundPlayer().execute();
        }

        setNoti(message);

    }
}
  

服务:

@Override
protected void onHandleIntent(Intent intent) {

    ring = rcv_ring();

    Intent ServiceIntent = new Intent("MainGate_ring");
    ServiceIntent.putExtra("ServiceMessage", ring);
    LocalBroadcastManager.getInstance(this).sendBroadcast(ServiceIntent);


}

5 个答案:

答案 0 :(得分:0)

onStop#LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);

literally取消注册接收者。因此,没有接收器可以接收来自服务的广播消息。

答案 1 :(得分:0)

问题出在这里

@Override
protected void onStop() {
    super.onStop();

    LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);
}

Activity.onStart()

  

在onCreate(Bundle)之后调用 - 或者在活动停止后onRestart()之后调用,但现在再次显示给用户。接下来是onResume()。

<强> Activity.onStop()

  

当您不再对用户可见时调用。您接下来将收到onRestart(),onDestroy()或什么都没有,具体取决于以后的用户活动。

一旦您离开您的活动,onStop()就会被调用,您取消注册您的接收者。

不要将您的取消注册代码放在onDestroy()中,因为它可能会被调用,也可能不被调用,Activity可能会在不调用它的情况下被杀死。

根据@Naveen Dissanayake的建议,你可能想重新考虑你的逻辑。

答案 2 :(得分:0)

您在内部活动中注册了BroadcastReceiver,因此,它将取决于Activity的生命周期。当您按下后退按钮时,活动进入“已停止”状态 - 调用onPause和onStop方法。 Android也可以破坏这项活动,资源不足。 另一方面,即使在ui没有准备好的情况下,服务还是可以毫无顾忌地运行。如果你想接收来自Activity的通知,有两个 可能的解决方案: - 在Application实例中创建,存储和管理BroadcastReceiver - 应用程序类仍在运行,直到您的应用程序被销毁。当服务通知您有关某些操作时,您似乎想播放声音。 在onCreate中注册BroadcastReceiver并在通知中的onDestroy中取消注册。 - 另一种解决方案 - 如果您想触发某个操作或IntentService,则使用另一个服务,对该广播作出反应。 我想考虑解决方案 - 创建一些ResponseService,将它与MainGate_Service(来自Application)一起启动,并将其从应用程序中停止。在该服务寄存器BroadcastReceiver中,如果您希望即使应用程序未运行,也可以将IntentFilter添加到清单中。在您的Activity中,绑定到该服务。 Serive会知道是否附加了某些UI(如果绑定了Activity),如果是,则会通知活动。如果没有 - 将做其他事情(也许,显示通知)

答案 3 :(得分:0)

无论何时按下主页按钮,onStop都会收到呼叫,并且您取消注册接收器,因此没有可以接收广播的广播接收器。

LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);

从onStop()中删除上面的行,或者在服务停止时取消注册。

答案 4 :(得分:0)

  

即使您的活动正在进行中也要接收广播   然后,背景

在onCreate(...)中注册

@Override
protected void onCreate(Bundle sis) {
    super.onCreate(sis);
    setContentView(...);
    LocalBroadcastManager.getInstance(this).registerReceiver(ServiceReceiver, new IntentFilter("MainGate_ring"));
}

在onDestroy()中注销

@Override
protected void onDestroy() {
    super.onDestroy();
    LocalBroadcastManager.getInstance(this).registerReceiver(ServiceReceiver, new IntentFilter("MainGate_ring"));
}
相关问题