LocalBroadcastManager无法正确接收消息

时间:2018-06-13 23:56:47

标签: java android localbroadcastmanager

我有一个,我认为是一个简单的任务。我在MainActivity中的recyclerView中有一个成就列表。单击其中一个成就将启动AchievementDetailActivity。您在AchievementDetailActivity中执行操作并完成成就。当发生这种情况时,我需要MainActivity上的缩略图是成就图标而不是锁定图标。我的想法是我可以使用LocalBroadcastManager从一个活动发送和接收消息到另一个活动,但这不起作用。从我读过的所有内容中,您应该在活动onPause和onStop生命周期方法中取消注册侦听器,但是,如果您在MainActivity的onPause中取消注册侦听器,则在AchievementDetailActivity启动且未将任何内容传递给MainActivity时,它将被取消注册。我不明白你如何使用LocalBroadCastManager和接收者在你开始一项新活动后立即取消注册活动之间发送信息。以下示例显示第一个活动启动后立即取消注册,因此第一个活动将永远不会播放...

public class MainActivity extends AppCompatActivity {

  public static final String ACTION = "update";

  private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("MAIN ACTIVITY", "RECEIVED EVENT");
    }
  }
  public void onStart() {
    super.onStart();
    LocalBroadcastManager.getInstance(this).registerReceiver(receiver), new IntentFilter(ACTION));
  }

  public void onPause() {
    Log.d("MAIN ACTIVITY", "REMOVING LISTENER");
    LocalBroadcastManager.getInstance(this).unregisterReceiver(receiver);
  }
  //.. The rest of MainActivity
}

public class SecondActivity extends AppCompatActivity {

  @Override
  public void onStart() {
    super.onStart();
    //initialize view and such
    button.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getApplicationContext());
        Intent intent = new Intent(MainActivity.ACTION);
        intent.putExtra("Something", "somewhere");
        manager.sendBroadcast(intent);
      }
    )};
  }

如果你运行上面的操作,很明显有了按钮等,你会收到一条消息,表明它会在SecondActivity启动后立即取消注册监听器,而MainActivity永远不会得到它在你点击按钮时应该获得的消息关于第二项活动。

有没有办法将活动信息发送到活动,或者因为生命周期事件不可能?我读到的一切都说LocalBroadcastManager是正确的方法,但它没有注册,所以,它怎么样?请帮忙,这让我疯了。谢谢。

2 个答案:

答案 0 :(得分:0)

为此目的使用LocalBroadcastReceiver并不是一个好主意。请改用startActivityForResult。请按照此Official doc了解实施细节。

它没有意思的原因是:

您正在onStart注册接收者,并在onPause()中取消注册。显示第二个活动时,系统会调用onPause (),因此BroadcastReceiver未注册。

保持注册不是一个好主意,因为它会导致内存泄漏。

答案 1 :(得分:0)

如果您想使用LocalBroadcastManager来获取结果,请unregister onPause unregisteronDestroy()startAvtivity必须startActivityForResult。{ / p>

如果 grid.loadNext(20, 60); 仅提取某些结果,则[Priority][Area....][Status..][Owner..................][Engineer...............] [Other1................................][Other2................................] 是一种好方法。