Android- activity 意图经历多个 onStart 和 onStop 周期

Android- activity intents living through multiple onStart and onStop cycles

任何在创建 activity 时或作为 onNewIntent() 的参数传递的意图,只要 activity 未被销毁就一直有效。好吧,就算activity is launched from recent apps section被摧毁了那又是另外一回事了。

我的问题是,在这种情况下,当 activity 来自背景 started/resumed 或来自最近应用程序部分的 'created' 时,避免由于旧意图而导致重复处理的最佳做法应该是什么。

比如说,我正在拉取 getDataString() 作为分析的例子,理想情况下应该仅在应用程序通过 deeplink 实际启动时才进行跟踪。但它在旧意图内的 onStart() 的调用链中每次都非常可用。推荐什么?

  1. 打算在 onStop() 中设置为空? //对我来说似乎最合乎逻辑。陷阱?
  2. 一些本地检查忽略值?
  3. onStop() 中设置临时字段以识别它是否是旧字段?

在尝试了各种案例之后,这是我的发现。其中一些意见可能最适合我的代码库,但我猜它们是普遍适用的。

  1. 设置 intent null 是有风险的,因为我们不能 保证代码库中的所有意图,包括被某些内部 api 间接使用,例如 activity getReferrer
  2. 无论如何,再次进行本地检查是解决此问题的较弱方法。
  3. 与上面类似,但更清晰。在意图本身中存储了一个字段,指示它是否已 'consumed' [用于任何处理]。函数看起来像:

    private void markIntentValuesTracked(final boolean status){
          if(getIntent() != null){
              getIntent().putExtra(LAUNCH_INTENT_VALUES_CONSUMED, status);
          }
      }
    

方法调用:

onCreate():

boolean isOldIntent = (getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0;
markIntentValuesTracked(isOldIntent);

onNewIntent(): markIntentValuesTracked(false);

onStop(): markIntentValuesTracked(true)