我有一个小部件,它根据按下的各个小部件按钮启动到特定的页面。当我有内存中的应用程序(即从部署(运行/调试))时,它可以正常工作,但是当我强制停止应用程序时,小部件就不能正常工作了。
当应用程序被强制停止时,小部件的第一次单击就正常工作,并调用相应活动的onCreate。然后,当按下主键并按下另一个小部件按钮时,调用上一个小部件活动的onRestart方法。
奇怪的是,日志消息没有出现,而且由于调试器无法连接,所以很难进行测试。有什么特别的事我做错了吗?
流程是-> WidgetDispatchActivity (处理真正的小部件目的地)-> ViewActivity> ->进一步分支(在下面的示例中为DetailViewActivity)。
小部件的onUpdate:
onUpdate(){
...
Intent viewIntent = new Intent(context, WidgetDispatchActivity.class);
viewIntent.putExtra("launch", WidgetInfo.VIEW_ACTIVITY);
PendingIntent viewPendIntent = PendingIntent.getActivity(context, 2, viewIntent, PendingIntent.FLAG_UPDATE_CURRENT);
...
}WidgetDispatchActivity的onCreate
Bundle b = getIntent().getExtras();
if (b != null && b.isEmpty()){
Log.i(LOG_TAG, "EMPTY BUNDLE ON WIDGET!");
}else{
Log.i(LOG_TAG, "WIDGET BUNDLE HAS ITEMS!");
}
String destination = null;
if (b != null && b.containsKey("launch")){
destination = b.getString("launch");
Log.i(LOG_TAG, "WIDGET ITEM FROM BUNDLE WAS: " + destination);
}
else{
Log.i(LOG_TAG, " \"launch\" item was not inside bundle!");
}
if(destination != null) {
Log.i(LOG_TAG, "PendingIntent received from widget!");
Intent goTo = new Intent(this, ViewActivity.class);
...
}
}LogCat
10-10 20:38:00.935: INFO/ActivityManager(58): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10200000 cmp=com.android.launcher/com.android.launcher2.Launcher }
10-10 20:38:00.956: INFO/DetailViewActivity(1154): ONPAUSE
10-10 20:38:00.975: WARN/InputManagerService(58): Ignoring hideSoftInput of: com.android.internal.view.IInputMethodClient$Stub$Proxy@450366d0
10-10 20:38:02.545: INFO/ActivityManager(58): Starting activity: Intent { flg=0x10000000 cmp=com.starbucks.mobilecard/com.xxx.xxx.widget.WidgetDispatchActivity bnds=[198,298][224,321] (has extras) }
10-10 20:38:02.585: INFO/ViewActivity(1154): ONRESTART
10-10 20:38:02.585: INFO/ViewActivity(1154): WIDGET LAUNCH:: == falseViewActivity onRestart:
protected void onRestart(){
super.onRestart();
Log.i(LOG_TAG,"ONRESTART");
Log.i(LOG_TAG,"WIDGET LAUNCH:: == " + WidgetInfo.getInstance().wasLaunchedFromWidget());
...
}AndroidManifest:
<activity android:name="com.xxx.xxx.ui.cards.ViewActivity" android:label="@string/_view_title" android:finishOnTaskLaunch="true" android:clearTaskOnLaunch="true" android:screenOrientation="portrait"/>
<activity android:name="com.xxx.xxx.widget.WidgetDispatchActivity" android:label="@string/widget_dispatch_title" android:finishOnTaskLaunch="true"/>发布于 2011-10-14 20:39:42
威尔梅尔
在强制关闭时阻止小部件工作的第一步是实现onDestroy()。在这里,您需要确保您与构成您的Widget通信的WidgetHost、HostViews和RemoteViews对话。
这个语句阻止WidgetHost接收来自Android的任何事件。myHost是对象,通常是保存对Widget的引用的活动。
// Stop the Widgets from fidgeting
myHost.stopListening();
myHost = null;在那里,您将希望删除对您可能引用的任何HostViews的引用。这是通过简单地获取引用并将其设置为null来完成的。在我的onDestroy()中,我使用以下循环..。
if (appWidgets != null) {
final int count = appWidgets.size();
for (int i = 0; i < count; i++) {
final Widget launcherInfo = appWidgets.get(i);
launcherInfo.hostView = null;
}
}在这里,launcherInfo是我扩展的AppWidget对象。hostView指的是我的AppWidgetHostView (这是表示我的AppWidgetHostView的视图)。appWidgets数组是我的启动程序正在跟踪的小部件列表。总的来说很简单。
使用小部件和WidgetHosts可能会有问题,这取决于您的设置。以上所说的正确的地方确实有助于减轻痛苦。
FuzzicalLogic
https://stackoverflow.com/questions/7718622
复制相似问题