Android小部件:无法保留旧值

时间:2012-08-18 17:46:32

标签: android widget android-pendingintent

我会说的很简单。我有我的小部件代码。我的小部件布局包含一个线性布局,其中包含一个按钮。在我的小部件代码中,我初始化一个字符串列表,其中包含一些值。 当我单击窗口小部件中的按钮时,我必须使用更多值更新我的列表。

所以,这是我的代码,

List<String> myList = null;
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
        int[] appWidgetIds) {
myList = new List<String>();
myList.add("1");
myList.add("2");
...
Intent intent = new Intent(context, getClass());
intent.setAction("CALL_UPDATE");
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
views.setOnClickPendingIntent(R.id.button, pendingIntent);
....
}

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("CALL_UPDATE")) {
        Toast.makeText(context, "Intent received"+myList , 2000).show();
    }
}

单击该按钮时,onReceive()正确接收广播。问题是,在onReceive()上,我看到我的列表为null而不是其中的某些值,因为之前添加了一些字符串对象。

有人可以帮忙吗?

THX! 拉胡

1 个答案:

答案 0 :(得分:2)

文档说:

  

这对你能做些什么有重要的影响   onReceive(Context,Intent)实现: 任何需要的东西   异步操作不可用 ,因为您需要   从函数返回来处理异步操作,但是在   那一点,BroadcastReceiver不再是活动的,因此   系统可以在异步操作之前自由地终止其进程   完成。

     

特别是,您可能无法显示对话框 或绑定到服务   在BroadcastReceiver中。对于前者,你应该使用   NotificationManager API。对于后者,你可以使用   Context.startService()将命令发送到服务。

并且:

  

onReceive()通常在其进程的主线程中调用,   所以你永远不应该在其中执行长时间运行的操作(有一个   在考虑之前系统允许的超过 10秒   接收器被阻挡,候选人被杀死)。你不能   在onReceive()的实现中启动一个弹出对话框。

修改
AppWidgetProvider是一个BroadcastReceiver,它的实例(以及它的字段)将在它的生命周期后被删除。当你在HomeScreen中创建一个新的widget实例时,AppWidgetProvider的onUpdateonReceive会调用此实例的AppWidgetProvider列表不为null。但是在调用onReceive(例如10秒)后,此实例将删除。当您单击按钮时,将创建AppWidgetProvider的第二个实例,并且它的列表为空。
您可以保存类的列表public static field并在需要时检索它。