gpt4 book ai didi

Android setIntent() 不会在重新创建的 Activity 中保留新值

转载 作者:行者123 更新时间:2023-11-29 02:38:01 25 4
gpt4 key购买 nike

我的 Activity (A) 是通过推送通知启动的,通过提供的 PendingIntent。如果这个 Intent 有某个键,那么我需要开始一个新的 Activity (B)。按回 B,我应该回到 A。如果我通过开发者设置启用“不保留 Activity ”,显然 A 在启动 B 后被杀死,这意味着从 B 返回 A 时,A 将按照原始 Intent 重新创建(它有额外的 key ) - 再次启动 B - 并导致用户卡在 B 上。

作为解决方法,我尝试在启动 B 并重置 Intent 之前删除 A 中的额外键。此代码来自 Activity 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 之前删除了 key ,但重新创建的 A 获得了带有 key 的旧 Intent 。基本上,永远不会打印日志(“无 A”)。

我尝试过的2种解决方案:

  1. 传递 PendingIntent.FLAG_ONE_SHOT 以创建 PendingIntent。根据文档,它应该可以工作,但事实并非如此。我对这个标志的理解有误吗?
  2. 在 Activity A 中设置一个实例变量,指示 Intent 是否已被使用一次。我可以通过 onSaveInstanceState() 在外部保留这个变量,它将在同一 Activity 的重新创建的实例中保留。这种方法感觉不太干净,因为它引入了一个新变量来跟踪多个生命周期方法。

最佳答案

A is obviously killed after launching B, which means on return from B to A, A is recreated with the original intent (which has the extra key) - which launches B again - and it results in the user being stuck on B.

您应该将状态保存在已保存的实例状态 Bundle 中,它告诉您是否应该启动 B。

The logs indicate that although setIntent() is deleting the key before launching B, recreated A gets the old intent with the key.

我的猜测是 setIntent() 只影响当前实例。它不会将指令发送回核心操作系统以某种方式将这个新的 Intent 与 Android 将用于重新创建 A 的返回堆栈记录相关联。

Is my understanding of this flag wrong?

该标志控制 PendingIntent。它不会影响由包裹在 PendingIntent 中的 Intent 启动的组件。

This approach does not feel clean, for introducing a new variable to track across multiple lifecycle methods.

欢迎您提出您的意见。 Activity 状态涉及很多事情,包括很多可能只需要调用一次的事情(例如,数据加载、确认消息)。这只是另一个。

关于Android setIntent() 不会在重新创建的 Activity 中保留新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45907699/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com