我的一项活动(A)通过推送通知通过PendingIntent提供。如果这个意图有一个特定的关键,那么我需要开始一个新的活动(B)。按回B,我应该返回到A.如果我通过开发人员设置启用了“不保留活动”,则启动B后显然会死亡,这意味着从B返回到A时,A会以原始意图重新创建(它有额外的键) - 它再次启动B - 它导致用户被困在B.Android setIntent()不会在重新创建的活动中保留新值
作为一种解决方法,我试图在启动B和重新设置意图之前删除A中的额外密钥。此代码来自活动A中的onCreate()
方法。我添加了一个AlarmManager
以轻松复制行为 - 与我的问题无关。
Intent originalIntent = getIntent();
if(originalIntent != null && originalIntent.hasExtra("A")){
Log.d(TAG, "onCreate: has A");
startActivity(new Intent(this, PAlarmTwo.class));
originalIntent.removeExtra("A");
setIntent(originalIntent);
Log.d(TAG, "onCreate: modified intent has A : " + getIntent().hasExtra("A"));
} else {
Log.d(TAG, "onCreate: no A");
}
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent alarmIntent = new Intent(PAlarmOne.this, PAlarmOne.class);
alarmIntent.putExtra("A", "a");
PendingIntent pendingIntent = PendingIntent.getActivity(PAlarmOne.this, 1, alarmIntent, 0);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+1000, pendingIntent);
}
});
日志表明,虽然setIntent()
被删除推出B之前的关键,重建A收到旧有意向的关键。基本上,日志(“否A”)从不打印。
2解决方案我曾尝试:
- 传递
PendingIntent.FLAG_ONE_SHOT
创建PendingIntent
。基于文档,它应该工作,但事实并非如此。我对这个标志的理解是错误的吗? - 在活动A中设置一个实例变量,指出该意图是否曾经使用过一次。我可以通过
onSaveInstanceState()
在外部持久保存这个变量,并且它会在同一活动的重新创建的实例中保留。这种方法并不感觉干净,因为引入了一个新变量来跟踪多个生命周期方法。