我正在创建一个appwidget,我遇到了点击事件的问题,当系统杀死窗口小部件的进程并稍后重新启动它时会丢失。屏幕旋转后也会发生这种情况。
针对SDK版本7构建并在模拟器(2.1)和2.3.3上的实际设备上运行。
我的onUpdate方法:
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int wid : appWidgetIds) {
Log.i(TAG, "onUpdate widget #" + wid);
Intent intent = new Intent(context, MyClass.class);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, wid);
PendingIntent clickIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget);
widget.setOnClickPendingIntent(R.id.widget_layout, clickIntent);
appWidgetManager.updateAppWidget(wid, widget);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
其中R.id.widget_layout是appwidget的线性布局的id。我试图将此点击事件也添加到textview,但结果相同。
我正在解决这个问题好几天,我发现有些人有同样的问题,但没有解决办法对我有用:(我也尝试了不同的待定意图标志而没有任何成功。
第二个问题是,当我在主屏幕上添加另一个appwidget时,它不会对点击事件做出反应。在logcat中,我看到来自onUpdate方法" onUpdate小部件#xy"的消息,但appwidget对点击没有反应。只有放在主屏幕上的第一个appwidget才会对点击作出反应,但只有一段时间。任何想法?
答案 0 :(得分:2)
当你说第一个小部件停止响应点击时,你的意思是没有调用onUpdate
方法吗?也许在onEnabled(Context context)
中放入一些代码来查看是否正在调用它,如果是,则在该函数中放置必要的逻辑。此外,您可以通过onReceive
方法(在同一链接中找到)捕获意图,以查看您的窗口小部件实际接收的方法。
此外,请确保运行接收器的Context
(传递给此功能的接收器)是应用程序或服务,而不是活动,或者对它的引用可能不会持久存在。
您还必须确保每次使用RemoteViews
对象更新窗口小部件时,都会发送完全重建窗口小部件所需的所有数据。这是因为在例如屏幕旋转时,系统没有任何东西可以在您传递它的最新RemoteViews
旁边重建窗口小部件。