Android-活动意图经历多个启动和停止周期

Android-活动意图经历多个启动和停止周期,android,android-intent,activity-lifecycle,Android,Android Intent,Activity Lifecycle,创建活动时传递的任何意图,或作为onNewIntent()的参数传递的任何意图,只要活动未被销毁,就有效。好吧,即使是在被摧毁后,但那是另一个问题 我的问题是,在这种情况下,当从后台启动/恢复活动或从“最近的应用程序”部分“创建”活动时,最佳做法是什么,以避免由于旧的意图而导致重复处理 比如说,我拉着getDataString()进行分析,理想情况下,只有当应用程序通过deeplink实际启动时,才能跟踪分析。但是在旧的意图中,每次在onStart()的调用链中,它都非常可用。推荐什么 在onS

创建活动时传递的任何意图,或作为
onNewIntent()
的参数传递的任何意图,只要活动未被销毁,就有效。好吧,即使是在被摧毁后,但那是另一个问题

我的问题是,在这种情况下,当从后台启动/恢复活动或从“最近的应用程序”部分“创建”活动时,最佳做法是什么,以避免由于旧的意图而导致重复处理

比如说,我拉着
getDataString()
进行分析,理想情况下,只有当应用程序通过
deeplink
实际启动时,才能跟踪分析。但是在旧的意图中,每次在
onStart()
的调用链中,它都非常可用。推荐什么

  • onStop()
    中,是否将意图设置为null//对我来说似乎最合乎逻辑。陷阱
  • 是否进行一些本地检查以忽略值
  • onStop()
    中设置临时字段以识别它是否为旧字段

  • 在尝试了各种案例之后,以下是我的发现。其中一些观点可能最适合我的代码库,但我猜它们一般都适用

  • 设置intent null是有风险的,可能会导致NPE,因为我们不能 保证代码库中使用的所有意图,包括某些内部api间接使用的意图,例如
  • 无论如何,本地检查是解决这一问题的一个薄弱环节
  • 与上面类似,但更干净。在intent中存储一个字段,指示它是否已被[任何处理]消耗。函数看起来像:

  • 方法调用:

    onCreate():

    onNewIntent():markIntentValuesTracked(false)

    onStop():markIntentValuesTracked(true)

    private void markIntentValuesTracked(final boolean status){
          if(getIntent() != null){
              getIntent().putExtra(LAUNCH_INTENT_VALUES_CONSUMED, status);
          }
      }
    
    boolean isOldIntent = (getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0;
    markIntentValuesTracked(isOldIntent);