Android小部件:无法保留旧值

3
我会尽力简化描述。我的小部件代码中,小部件布局包含一个线性布局和其中一个按钮。在我的小部件代码中,我使用一些值初始化了一个String列表。
当我点击小部件上的按钮时,我需要用一些其他值更新我的列表。 以下是我的代码:
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,而不是其中一些字符串对象中添加的值。

有人能帮忙吗?

谢谢! Rahul。

1个回答

2

文档说明:

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

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

并且:

onReceive()通常在其进程的主线程中调用,因此您不应在其中执行长时间运行的操作(系统允许10秒超时,然后考虑将接收器视为已阻塞并可能被终止)。您不能在onReceive()中启动弹出式对话框。

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


谢谢提供这么好的信息,很有道理。我可能需要寻找其他解决问题的方法。 - rahul
@rahul,我在我的答案末尾提供了一种简单的方法。请查看。 - hasanghaforian
命名成员为静态的方式可行。感谢信息和解决方案。 - rahul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接