我会说的很简单。我有我的小部件代码。我的小部件布局包含一个线性布局,其中包含一个按钮。在我的小部件代码中,我初始化一个字符串列表,其中包含一些值。 当我单击窗口小部件中的按钮时,我必须使用更多值更新我的列表。
所以,这是我的代码,
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! 拉胡
答案 0 :(得分:2)
文档说:
这对你能做些什么有重要的影响 onReceive(Context,Intent)实现: 任何需要的东西 异步操作不可用 ,因为您需要 从函数返回来处理异步操作,但是在 那一点,BroadcastReceiver不再是活动的,因此 系统可以在异步操作之前自由地终止其进程 完成。
特别是,您可能无法显示对话框 或绑定到服务 在BroadcastReceiver中。对于前者,你应该使用 NotificationManager API。对于后者,你可以使用 Context.startService()将命令发送到服务。
并且:
onReceive()通常在其进程的主线程中调用, 所以你永远不应该在其中执行长时间运行的操作(有一个 在考虑之前系统允许的超过 10秒 接收器被阻挡,候选人被杀死)。你不能 在onReceive()的实现中启动一个弹出对话框。
修改强>:
AppWidgetProvider是一个BroadcastReceiver
,它的实例(以及它的字段)将在它的生命周期后被删除。当你在HomeScreen中创建一个新的widget实例时,AppWidgetProvider的onUpdate
和onReceive
会调用此实例的AppWidgetProvider列表不为null。但是在调用onReceive(例如10秒)后,此实例将删除。当您单击按钮时,将创建AppWidgetProvider的第二个实例,并且它的列表为空。
您可以保存类的列表public static field
并在需要时检索它。