重复事件 - 关闭/重新打开应用程序时的多个广播事件问题

时间:2016-03-10 14:41:49

标签: java android android-activity

我有一个应用程序,其活动将广播发送到另一个活动。 一切似乎都很好。但如果我关闭我的应用程序并再次打开它, 这个广播似乎不止一次发送。实际上它会被发送 我经常重新打开应用程序。如果我在发送广播之前打印出“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();
    }

1 个答案:

答案 0 :(得分:1)

始终确保您在同一“目标”中注册和取消注册您使用的任何接收器。

在:

LocalBroadcastManager.getInstance(this).unregisterReceiver(serviceMessageReceiv‌​er);

Context.unregisterReceiver(serviceMessageReceiv‌​er);

  

注意:使用unregisterReceiver(serviceMessageReceiv‌​er)表示您使用的this引用指向要添加代码的本地上下文。

这是两个不同的“观察者”,每种广播都有一个。