我对我正在开发的应用程序中遇到的这种行为感到困惑......
短
当用户按下后退按钮离开应用程序然后按下最近的按钮重新进入应用程序时,意图数据不会清除。 (每隔一个案例,意图数据被清除)
长:
我有一个带有启动画面的应用程序,用于收集从URI方案传入的数据。然后我设置了将数据转发到主要活动的意图。主要活动包含片段,基于主/详细模板。
在所有情况下都会清除意图数据,例如按主页按钮然后返回应用程序,按最近的应用程序按钮然后返回应用程序等。意图数据的唯一情况是未清除的是用户按下后退按钮,然后是最近的应用程序按钮以返回应用程序。
涉及意图的相关代码片段:
// Splash Screen Activity
@Override
protected void onPostExecute(Void result) {
// Data is done downloading, pass notice and app ids to next activity
Intent intent = new Intent(getBaseContext(), ListActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("id1", id1);
intent.putExtra("id2", id2);
intent.putExtra("id3", id3);
startActivity(intent);
finish();
}
// ListActivity retrieving intent data
Intent intent = getIntent();
if (intent != null) {
this.id1 = intent.getExtras().getString("id1");
this.id2 = intent.getExtras().getString("id2");
this.id3 = intent.getExtras().getString("id3");
}
// ListActivity clearing intent data
@Override
public void onPause() {
super.onPause();
// Clear intent data
Intent intent = getIntent();
intent.putExtra("id1", "");
intent.putExtra("id2", "");
intent.putExtra("id3", "");
}
我想要注意的是,我也尝试过使用intent.removeExtra(“id1”),但这也没有用。
知道发生了什么事吗?就好像Android保持旧的意图,即使总是调用onPause()来清除意图数据。
答案 0 :(得分:24)
实际上这是因为Android从历史记录中启动应用程序,因此意图附加功能仍在那里
因此添加此条件以处理此特殊情况为我修复了
int flags = getActivity().getIntent().getFlags();
if ((flags & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0) {
// The activity was launched from history
// remove extras here
}
答案 1 :(得分:2)
我认为这里的不同之处在于Back键实际上导致您的Activity完成,而Home按钮会导致您的活动暂停,但尚未完成。
所以当您的流程重新回到正面时在Home案例中,它只是恢复已经存在的Activity实例,而在Back case中,系统正在实例化Activity的新副本,调用onCreate()
,并将最后一个Intent记录的新副本交给它对于那项活动。
答案 2 :(得分:1)
在onPause()
中,您正在清除Intent
的“副本”中的附加内容。您可以尝试添加
setIntent(intent);
清除附加内容后到onPause()
(虽然调用removeExtra()
可能也可以,而不是设置额外的空字符串)。
注意:强>
但是,我认为这种设计存在缺陷。您不应使用Intent
来跟踪应用程序中的状态。您应该在共享首选项中保存一些状态,因为这将在您的应用程序被杀死/重新启动,重新启动手机或其他任何内容后继续存在。
问题是新的Intent
没有保留,因此如果用户按下HOME按钮并且您的应用程序转到后台,然后Android会因为它未激活而杀死您的应用,那么当用户返回时到应用程序,Android将为您的应用创建一个新流程,它将使用原始意图重新创建活动。
此外,如果您阅读getIntent()
的文档,则说明它返回启动活动的意图。
答案 3 :(得分:1)
为了解决我面临的问题,我选择使用SharedPreferences作为在活动之间传递数据的方法。
我知道SharedPreferences通常不会用于此目的,但它解决了我的问题并且有效。