Android应用程序实例被清除为null

时间:2019-06-14 02:56:20

标签: android

我将应用程序实例保存为我的应用程序中的静态成员,如下所示:

public class MyApplication extends MultiDexApplication {
    private static MyApplication sInstance;

    public void onCreate() {
        super.onCreate();
        sInstance = this;
        // other code
    }

    public static MyApplication get(){
        return sInstance;
    }
}

MyApplication中没有类似于set的方法。因此,按照我的假设,在我的应用的整个生命周期中引用的sInstance都不应为null。

但是实际上,我发现由MyApplication.get()返回null导致的一些NPE崩溃,即使它在Activity onCreate / onDestroy中被调用也是如此。

我只是不明白为什么sInstance为null。我认为,在启动该过程之前,应先将应用程序初始化。有人知道为什么吗?

2 个答案:

答案 0 :(得分:0)

我的应用程序日志中发生了类似的崩溃,MyApplication.get()方法上的NPE崩溃了。经过长时间的搜索,我发现此崩溃是由从云中还原应用程序引起的。

如果清单文件的应用程序标签中有android:allowBackup="true",也可能是您的情况。

还原应用程序数据时,该应用程序将以不寻常的方式被杀死,并且当用户再次启动该应用程序时,将永远不会调用MyApplication.onCreate方法。

重现此崩溃的简便步骤是:

1)在设备设置中启用将应用程序数据保存在云上。

2)通过启动adb shell bmgr backupnow my.package.name

从命令行强制为应用程序进行云存储

3)启动应用

4)从命令行触发云备份:adb shell bmgr restore my.package.name =>应用程序将停止

5)通过单击其图标=>再次启动该应用,该应用因NPE而崩溃

您可以通过重复步骤4和5再次触发崩溃。

有多种方法可以解决此崩溃问题:

  • 禁用备份:android:allowBackup="false"

  • 从活动getApplication方法获取一个应用程序实例(警告:我不确定它将是MyApplication对象)

  • 在应用程序实例为空时强制杀死并重新启动应用程序

  • 使用自定义的BackupAgent避免该问题

答案 1 :(得分:0)

您是否在这样的gradle文件中启用了multidex

   android {
        defaultConfig {
            ...
            minSdkVersion 15 
            targetSdkVersion 28
            multiDexEnabled true
     }
   }