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()
的调用链中每次都非常可用。推荐什么?
- 打算在
onStop()
中设置为空? //对我来说似乎最合乎逻辑。陷阱?
- 一些本地检查忽略值?
- 在
onStop()
中设置临时字段以识别它是否是旧字段?
在尝试了各种案例之后,这是我的发现。其中一些意见可能最适合我的代码库,但我猜它们是普遍适用的。
- 设置 intent null 是有风险的,因为我们不能
保证代码库中的所有意图,包括被某些内部 api 间接使用,例如 activity getReferrer
- 无论如何,再次进行本地检查是解决此问题的较弱方法。
与上面类似,但更清晰。在意图本身中存储了一个字段,指示它是否已 '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)
任何在创建 activity 时或作为 onNewIntent()
的参数传递的意图,只要 activity 未被销毁就一直有效。好吧,就算activity is launched from recent apps section被摧毁了那又是另外一回事了。
我的问题是,在这种情况下,当 activity 来自背景 started/resumed 或来自最近应用程序部分的 'created' 时,避免由于旧意图而导致重复处理的最佳做法应该是什么。
比如说,我正在拉取 getDataString()
作为分析的例子,理想情况下应该仅在应用程序通过 deeplink
实际启动时才进行跟踪。但它在旧意图内的 onStart()
的调用链中每次都非常可用。推荐什么?
- 打算在
onStop()
中设置为空? //对我来说似乎最合乎逻辑。陷阱? - 一些本地检查忽略值?
- 在
onStop()
中设置临时字段以识别它是否是旧字段?
在尝试了各种案例之后,这是我的发现。其中一些意见可能最适合我的代码库,但我猜它们是普遍适用的。
- 设置 intent null 是有风险的,因为我们不能 保证代码库中的所有意图,包括被某些内部 api 间接使用,例如 activity getReferrer
- 无论如何,再次进行本地检查是解决此问题的较弱方法。
与上面类似,但更清晰。在意图本身中存储了一个字段,指示它是否已 '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)