当我的服务正在运行并且我可以在屏幕上看到我的应用程序时,一切正常。我的服务发送广播消息,我可以在我的" 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);
}
答案 0 :(得分:0)
onStop#LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);
literally
取消注册接收者。因此,没有接收器可以接收来自服务的广播消息。
答案 1 :(得分:0)
问题出在这里
@Override
protected void onStop() {
super.onStop();
LocalBroadcastManager.getInstance(this).unregisterReceiver(ServiceReceiver);
}
在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)
即使您的活动正在进行中也要接收广播 然后,背景
@Override
protected void onCreate(Bundle sis) {
super.onCreate(sis);
setContentView(...);
LocalBroadcastManager.getInstance(this).registerReceiver(ServiceReceiver, new IntentFilter("MainGate_ring"));
}
@Override
protected void onDestroy() {
super.onDestroy();
LocalBroadcastManager.getInstance(this).registerReceiver(ServiceReceiver, new IntentFilter("MainGate_ring"));
}