Android活动意图通过多个onStart和onStop周期生成

时间:2017-02-12 18:44:01

标签: android android-intent activity-lifecycle

只要活动未被销毁,任何在创建活动时或作为onNewIntent()的参数传递的意图都会存在。好吧,即使被摧毁后activity is launched from recent apps section,也是另一个问题。

我的问题是,在这种情况下,最好的做法应该是避免因活动开始/从后台恢复活动而导致的重复处理,或者创建'来自最近的应用程序部分。

比如说,我正在提取getDataString()例如,只有在应用实际通过deeplink启动时,才能理想地跟踪分析。但是,每次在onStart()的调用链中,它都可以在旧的意图中使用。推荐什么?

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

1 个答案:

答案 0 :(得分:0)

在尝试各种案例后,我发现了这一点。其中一些观点可能最适合我的代码库,但我猜它们通常适用。

  1. 设置意图null是有风险的,并且可能导致NPE,因为我们不能 保证代码库中所有意图的用途,包括由某些内部api间接使用,例如activity getReferrer
  2. 再次进行本地检查无论如何都是一种解决这个问题的弱点。
  3. 与上述相似但更清洁。在意图中存储一个字段,指示它是否已被“消耗”[用于任何处理]。功能如下:

    private void markIntentValuesTracked(final boolean status){
          if(getIntent() != null){
              getIntent().putExtra(LAUNCH_INTENT_VALUES_CONSUMED, status);
          }
      }
    
  4. 方法调用:

    onCreate():

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

    onNewIntent(): markIntentValuesTracked(false);

    onStop(): markIntentValuesTracked(true)