为什么Application实例有时可以为null

时间:2017-07-03 13:46:27

标签: android

有时,在崩溃报告中,我可以在我的Application中遇到AppWidgetProvider实例为空。

这让我很困惑,因为我永远无法重现同样的问题。

我的设置如下

的AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    ... >

    <application
        android:name=".JStockApplication"
        ... >

JStockApplication.java

public class JStockApplication extends android.support.multidex.MultiDexApplication  {
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    public void onCreate(){
        super.onCreate();

        me = this;

        sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);

        jStockOptions = JStockOptions.newInstance(sharedPreferences);
    }

    public static JStockApplication instance() {
        return me;
    }

    public JStockOptions getJStockOptions() {
        return jStockOptions;
    }
}

JStockAppWidgetProvider

public class JStockAppWidgetProvider extends AppWidgetProvider {
    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // context is not null. But, I'm not sure what is context.
        //
        // From crash report, JStockApplication.instance() can be null rarely.
        // JStockApplication.instance().getJStockOptions() will cause NPE.
    }
}

非常罕见,JStockApplication.instance().getJStockOptions()会导致NPE!

我意识到大多数人(https://stackoverflow.com/a/5114361/72437)执行

me = this;
onCreate

中的

我不确定,执行此类初始化(以及PreferenceManager.getDefaultSharedPreferences(this))是否有助于解决此类神秘崩溃。

你有什么想法,NPE为什么会发生?

1 个答案:

答案 0 :(得分:0)

我知道这个问题有点老,但是最近我刚刚遇到了类似的问题,这是由于从云中恢复应用程序数据引起的

清单的应用程序标记中是否有android:allowBackup =“ true”?如果是,则可能涉及此备份/还原过程。

从云中还原数据时,将以特定方式关闭该应用程序,然后再次启动该应用程序时,不会调用Application.onCreate方法。

为了重现这一点,请执行以下几个步骤:

  1. 从设备设置启用云上的应用程序数据备份
  2. 通过强制将应用程序数据保存在云中来确保将其保存在云中 命令行:adb shell bmgr backupnow my.package.name
  3. 启动应用
  4. 使用以下命令从命令行触发应用程序日期恢复:shell bmgr restore my.package.name;该应用将被停止
  5. 只需从其图标启动应用程序=>它将在NPE处于打开状态时崩溃 Application.getInstance()

要再次重现此崩溃,只需重复步骤4和5。