我有一个应用程序,它有一个派生自 Application 类的类,并且注意到它的 onCreate() 方法被多次调用。除此之外,每次调用 onCreate() 时都会重置其静态变量的值。
这种行为只发生在 M 上,它不会发生在 L 上。我试图找出它是 M 中的错误还是 M 中的预期更改,或者应用程序架构存在一些基本的固有问题,这些问题一直处于休眠状态,直到现在用 M 表现出来。
每当调用广播接收器的 onReceive() 时,都会调用 Application 派生类的 onCreate()。没有创建 Application 类的多个实例 - onCreate() 在同一个对象实例上被调用,并且始终存在相同的应用程序上下文。
以下是一些代码片段,展示了这一观察结果:
public class MyApplication extends Application
{
public static int debugVal = 5;
public MyApplication ()
{
theApp = this;
}
public void onCreate ()
{
Log.v(TAG, "++++++++++++ onCreate() debugVal: " + debugVal);
debugVal = 10;
....
public class MyBroadcastReceiver extends BroadcastReceiver
{
@Override
public void onReceive (Context context, Intent intent)
{
Log.v(TAG, "onReceive. debugVal: " + MyApplication.debugVal);
...
在 Marshmallow 上运行时,logcat 输出为:
831-1412/? I/ActivityManager Start proc 2244:com.company.redacted/u0a86 for broadcast com.company.redacted/com.company.redacted2.MyBroadcastReceiver
2244-2244/? V/MyApplication: ++++++++++ onCreate() debugVal: 5
2244-2244/? V/MyBroadcastReceiver: onReceive. debugVal: 10
...
831-1327/? I/ActivityManager: Start proc 3271.com.company.redacted/u0a86 for broadcast com.company.redacted2/com.company.redacted1.MyBroadcastReceiver
3271-3271/? V/MyApplication: +++++++++++ onCreate() debugVal: 5
....
了解如何多次调用 onCreate(),以及第二次调用 onCreate() 时 debugVal 如何丢失其值 10。当在 Lollipop 上运行相同的 .apk 时,不存在对 onCreate() 的第二次调用。
L 上的日志如下所示:
768-783/? I/ActivityManager: Start proc 2480:com.company.redacted/u0a84 for broadcast com/company.redacted1/com.company.redacted2/MyBroadcastReceiver
2480-2480/? V/MyApplication: +++++++++++ onCreate() debugVal:5
2480-2480/? V/MyBroadcastReceiver: onReceive. debugVal: 10
....
2480-2480/com.company.redaced1 v/MyBroadcastReceiver: onReceive. debugVal: 10
我想知道发生了什么并消除它,但如果我不能,是否可以用一些单例类替换 Application 类,其静态变量保证安全可靠并且只初始化一次?
这是一个预安装的应用程序,它在启动时启动(这是接收器侦听的意图之一),此时没有任何活动。