为什么我的AppWidgetProvider中的这些状态变量onReceive为null?

时间:2014-12-24 22:54:40

标签: java android android-widget android-appwidget

我在onUpdate中分配了变量,需要访问app appidget类的onReceive中的值。

public class MyWidgetProvider extends AppWidgetProvider {
    private static String name;
    private static SharedPreferences myPrefs;
    private static final String START_ACTION = "start";

    @Override
    public void onUpdate(final Context context, final AppWidgetManager appWidgetManager,
                               final int[] appWidgetIds) {
        views = new RemoteViews(context.getPackageName(), R.layout.layout_widget);
        Intent intent1 = new Intent(context, MyAppWidgetProvider.class);
        providerIntent.setAction(START_ACTION);
        pendingIntent = PendingIntent.getBroadcast(context, 0, providerIntent, 0);
        ....
        myPrefs = Context.getSharedPreferences("PrefsName", 0x0000);
        name = "new name";
        networkClient.requestItem(name, new JsonHandler {
            @Override
            public void requestSuccess(JSONObject resp) {
                views.setOnClickPendingIntent(R.section, pendingIntent);
            }
    }

    @Override 
    public void onReceive(@NonNull final Context context, @NonNull Intent intent) {
        super.onReceive(context, intent);
        if(intent.getAction().equals(START_ACTION)) {
            myPrefs.edit().putString("someKey", name).commit();
        }
    }

我将日志消息放入onReceive中,并看到myPrefs和name都为null。

然后我通过调试器运行它:

  1. onUpdate被调用,“myPrefs”被初始化了一个值,然后也是“名字”。
  2. 我点击了一个部分并调用了onReceive,在那里我发现myPrefs和name为null!
  3. 我读了onUpdate() intilized variable are null in onReceive of widget class并确保这些状态变量是静态的,但它们仍然是空的。为什么会这样,以及如何在onReceive中保留这些值?

1 个答案:

答案 0 :(得分:4)

您的流程可能会在onReceive()的调用之间终止。如果您希望保留BroadcastReceiver的数据,例如AppWidgetProvider,请使用某些持久性数据存储(数据库,SharedPreferences或其他类型的文件)。 静态数据成员只是一个缓存,不再是