3

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

所以,这是我的代码,

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 而不是其中的一些值,因为之前添加了一些字符串对象。

任何人都可以帮忙吗?

谢谢!拉胡尔。

4

1 回答 1

2

文档说:

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

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

和:

onReceive() 通常在其进程的主线程中调用,因此您不应该在其中执行长时间运行的操作(在考虑接收器被阻塞和候选被杀死之前,系统允许超时10 秒) )。您不能在 onReceive() 的实现中启动弹出对话框。

编辑
AppWidgetProvider 是一个BroadcastReceiver,它的实例(以及它的字段)将在它的生命周期后被删除。当你在 HomeScreen 中创建一个新的小部件实例时,onUpdateAppWidgetProvideronReceive调用和这个 AppWidgetProvider 实例的列表不为空。但是在调用之后onReceive(例如 10 秒)此实例将被删除。当您单击按钮时,将创建 AppWidgetProvider 的第二个实例,并且它的列表为空。
您可以保存public static field课程列表并在需要时检索它。

于 2012-08-18T18:04:09.077 回答