我有一个,我认为是一个简单的任务。我在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是正确的方法,但它没有注册,所以,它怎么样?请帮忙,这让我疯了。谢谢。
答案 0 :(得分:0)
为此目的使用LocalBroadcastReceiver
并不是一个好主意。请改用startActivityForResult
。请按照此Official doc了解实施细节。
它没有意思的原因是:
您正在onStart
注册接收者,并在onPause()
中取消注册。显示第二个活动时,系统会调用onPause ()
,因此BroadcastReceiver
未注册。
保持注册不是一个好主意,因为它会导致内存泄漏。
答案 1 :(得分:0)
如果您想使用LocalBroadcastManager
来获取结果,请unregister
onPause
unregister
,onDestroy()
中startAvtivity
必须startActivityForResult
。{ / p>
如果
grid.loadNext(20, 60);
仅提取某些结果,则[Priority][Area....][Status..][Owner..................][Engineer...............]
[Other1................................][Other2................................]
是一种好方法。