2017-08-27 207 views
2

我的一项活动(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解决方案我曾尝试:

  1. 传递PendingIntent.FLAG_ONE_SHOT创建PendingIntent。基于文档,它应该工作,但事实并非如此。我对这个标志的理解是错误的吗?
  2. 在活动A中设置一个实例变量,指出该意图是否曾经使用过一次。我可以通过onSaveInstanceState()在外部持久保存这个变量,并且它会在同一活动的重新创建的实例中保留。这种方法并不感觉干净,因为引入了一个新变量来跟踪多个生命周期方法。

回答

0

一个推出B,这意味着在从B到A返回后明显死亡,A被重新使用原来的意图(其中有额外的键) - 这又推出乙 - 它导致用户粘在B.

你应该在保存实例状态Bundle,告诉你可以节省你的状态是否应该首发B.

日志表明,虽然setIntent()是删除在启动B之前的密钥,重新创建A时会获得旧密钥的意图。

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

是我这个标志的理解错了吗?

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

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

欢迎您的意见。活动状态涉及很多事情,包括大量可能只需调用一次的内容(例如,数据加载,确认消息)。这只是另一个。