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

Android setIntent()不会在重新创建的活动中保留新值,android,android-intent,android-pendingintent,Android,Android Intent,Android Pendingintent,我的一项活动(A)是通过提供的PendingEvent推送通知启动的。如果这个意图有一个特定的关键,那么我需要开始一个新的活动(B)。按下B键,我应该返回到A。如果我通过开发人员设置启用“不保留活动”,A显然在启动B后被杀死,这意味着在从B返回到A时,A会按照原始意图(有额外的键)重新创建—再次启动B—并导致用户卡在B上 作为一种解决方法,我尝试在启动B并重置意图之前移除a中的额外密钥。此代码来自活动A中的onCreate()方法。我添加了一个AlarmManager来轻松复制该行为-它与我的问

我的一项活动(A)是通过提供的PendingEvent推送通知启动的。如果这个意图有一个特定的关键,那么我需要开始一个新的活动(B)。按下B键,我应该返回到A。如果我通过开发人员设置启用“不保留活动”,A显然在启动B后被杀死,这意味着在从B返回到A时,A会按照原始意图(有额外的键)重新创建—再次启动B—并导致用户卡在B上

作为一种解决方法,我尝试在启动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会使用密钥获取旧的意图。基本上,日志(“no A”)从不打印

我尝试过两种解决方案:

  • 传递
    pendingent.FLAG_ONE_SHOT
    以创建
    pendingent
    。根据文档,它应该可以工作,但事实并非如此。我对这面旗帜的理解是错误的吗
  • 在活动A中设置实例变量,指示意图是否已使用过一次。我可以通过
    onSaveInstanceState()
    在外部持久化此变量,它将在同一活动的重新创建的实例之间持久化。这种方法并不干净,因为它引入了一个新的变量来跟踪多个生命周期方法
  • A显然是在启动B后被杀死的,这意味着从B返回到A时,A会按照原始意图(有额外的键)重新创建—再次启动B—这会导致用户被卡在B上

    您应该将状态保存在saved instance state
    捆绑包中,该捆绑包告诉您是否应该启动B

    日志表明,尽管setIntent()在启动B之前删除了该键,但重新创建的A会使用该键获取旧的intent

    我猜
    setIntent()
    只影响当前实例。它不会向核心操作系统发送指令,以某种方式将这个新的
    Intent
    与Android将用于重新创建一个应用程序的后台堆栈记录关联起来

    我对这面旗帜的理解是错误的吗

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

    这种方法并不干净,因为它引入了一个新的变量来跟踪多个生命周期方法


    欢迎你发表意见。活动状态中涉及很多内容,包括许多可能只需要调用一次的内容(例如,数据加载、确认消息)。这只是另一个教程。

    本教程对我很有用:

     public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                 setContentView(R.layout.main);
               processExtraData();
                    }
    
    protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
     setIntent(intent);//must store the new intent unless getIntent() will return the old 
    one
    processExtraData()
     }
    
    private void processExtraData(){
    Intent intent = getIntent();
    //use the data received here
    }