我有一个应用程序,其活动将广播发送到另一个活动。 一切似乎都很好。但如果我关闭我的应用程序并再次打开它, 这个广播似乎不止一次发送。实际上它会被发送 我经常重新打开应用程序。如果我在发送广播之前打印出“Activity.this”,我会得到不同的实例。
为什么会发生这种情况?为什么活动没有死亡?我查了一下,onDestroy get的调用。但我有一个后台服务,当应用程序关闭时我不会停止。是吗?我可以在启动应用程序时重新打开旧活动而不是打开新活动吗?
将Manifest中的launchmode设置为singleTask或singleInstance也不起作用。
修改 即使使用像第二个答案Prevent multiple instances of my Android application composed of a single activity中的AtomicInteger也行不通。
谢谢!
修改
我在ClientActivity(主要)中有一个广播接收器,来自我的服务。在这里,我将广播发送到另一个Activity(MessageActivity)。
private BroadcastReceiver serviceMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("test", ClientActivity.this.tostring();
sendToMessageActivity(newDBMessageStr, "updateMessageList");
}
};
private void sendToMessageActivity(String message, String putExtra)
{
Intent intent = new Intent("de.blabla.bla.sendToMessageActivity");
sendLocationBroadcast(intent, message, putExtra);
}
private void sendLocationBroadcast(Intent intent, String message, String putExtra)
{
intent.putExtra(putExtra, message);
LocalBroadcastManager.getInstance(this).sendBroadcast(intent);
}
我在ClientActivity的onCreate-Method中注册了这个:
LocalBroadcastManager.getInstance(this).registerReceiver(
serviceMessageReceiver, new IntentFilter("de.blabla.bla.serverMessage"));
其他名为“MessageActivity”的活动从ClientActivity(main)获取广播,如上所述在onCreate中注册以下内容:
LocalBroadcastManager.getInstance(this).registerReceiver(
mainMessageReceiver, new IntentFilter("de.freshD.crapapp.sendToMessageActivity"));
稍后它会在此处收到消息:
private BroadcastReceiver mainMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
...
}
};
修改
@Override
protected void onPause() {
super.onPause();
}
@Override
public void onDestroy()
{
try
{
unregisterReceiver(serviceMessageReceiver);
}
catch (Throwable e) //IOException e
{
Log.d(logtag, "...Error data send: " + e.getMessage() + "...");
}
super.onDestroy();
}
哦,当调用onPause时,我需要在那里取消注册接收器吗?
我编辑onPause是这样的:(它没有修复错误)
@Override
protected void onPause() {
try
{
unregisterReceiver(serviceMessageReceiver);
}
catch (Throwable e) //IOException e
{
Log.d(logtag, "...Error data send: " + e.getMessage() + "...");
}
super.onPause();
}
答案 0 :(得分:1)
始终确保您在同一“目标”中注册和取消注册您使用的任何接收器。
在:
LocalBroadcastManager.getInstance(this).unregisterReceiver(serviceMessageReceiver);
和
Context.unregisterReceiver(serviceMessageReceiver);
注意:使用
unregisterReceiver(serviceMessageReceiver)
表示您使用的this
引用指向要添加代码的本地上下文。
这是两个不同的“观察者”,每种广播都有一个。