我需要计算用户启动应用的次数。我将值存储在共享首选项中,并将计数逻辑放在onCreate()
。
现在,由于在许多不同的场景中调用onCreate()
,并非所有场景都包括实际启动应用程序的用户,我使用保存的实例状态包来存储{{1 - 如果标志不存在,我认为用户手动启动了应用程序。
这是必要的,还是仅仅检查传递给OnSaveInstanceState()
的{{1}}捆绑包?在任何一种情况下,为什么?
答案 0 :(得分:3)
您可以在意图上调用getCategories()
,看它是否包含LAUNCHER类别。
答案 1 :(得分:1)
你可以考虑另一种方式......每次调用onDestroy()时都会递增计数器。通过这种方式,您可以保证程序实际上没有内存,并且计数器最多只会被1个关闭。
只是抛出一个想法,希望它能为你提供更多自己的想法!
答案 2 :(得分:1)
null
结帐onCreate()
应该可以正常使用。无需在onSaveInstanceState()
中设置单独的标记。但是有一个可能的问题。
假设用户将您的应用程序置于后台(按主页键)。申请过程最终会被杀死。当用户重新启动应用程序时,您将在Bundle
中收到一个正确的onCreate()
对象,并设置了该标志。用户可以通过每次只为后台处理应用程序来防止计数器增加。
如果背景可能成为问题,您可以尝试以下方式:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
if (getLastNonConfigurationInstance() == null) {
counter++;
}
}
public Object onRetainNonConfigurationInstance() {
return new Object();
}
之前我使用过上面的代码,它适用于Eclair,FroYo和Gingerbread。在Honeycomb中似乎已将getLastNonConfigurationInstance()
和onRetainNonConfigurationInstance()
标记为已弃用,因此我不确定在您定位Honeycomb的情况下它是如何工作的。
答案 3 :(得分:0)
在onCreate
方法内,请勾选Activity#getCallingActivity
。如果应用程序未从其他活动启动,则返回null
。
答案 4 :(得分:0)
首先,谢谢大家的答案。他们都以某种方式帮助过。
也就是说,经过多次尝试和不同的方法,我认为没有实际的100%可靠的方法来确定用户何时启动了应用程序。没有一个活动生命周期回调可以真正用于解决这个问题,无论是单独的还是组合的。
我得到的最接近的是计算onResume()
次来电的数量,然后根据onPause()
的回报在isFinishing()
中减去它。然而,这种方法不考虑主页按钮,也可能是用户可以用来隐藏应用程序的其他事项。
如果我找到了可靠的方法,我会更新这个答案。