我将应用程序实例保存为我的应用程序中的静态成员,如下所示:
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。我认为,在启动该过程之前,应先将应用程序初始化。有人知道为什么吗?
答案 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
}
}