1

当我的服务正在运行并且我可以在屏幕上看到我的应用程序时,一切正常。我的服务发送广播消息,我可以在“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);


}
4

5 回答 5

1

每当您按下主页按钮时,onStop 都会接到电话,并且您会取消注册接收器,因此没有可以接收广播的广播接收器。

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

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

于 2016-11-04T07:55:03.547 回答
0

问题就在这里

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

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

活动.onStart()

在 onCreate(Bundle) 之后调用 - 或在活动已停止但现在再次向用户显示的 onRestart() 之后调用。紧随其后的是 onResume()。

活动.onStop()

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


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

不要将您的注销代码放入onDestroy()其中,因为它可能会或可能不会被调用,并且Activity可能会在不调用它的情况下被杀死。

正如@Naveen Dissanayake 所建议的那样,您可能需要重新考虑您的逻辑。

于 2016-11-04T06:29:39.400 回答
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"));
}
于 2019-04-18T06:29:01.583 回答
0

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

于 2016-11-04T06:42:29.273 回答
0
onStop#LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);

literally注销接收器。所以没有接收者可以接收来自服务的广播消息。

于 2016-11-04T06:24:48.230 回答