有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java小部件在应用程序被强制停止后无法正常启动

我有一个小部件,它根据按下的各种小部件按钮启动到特定页面。当我将应用程序放在内存中时(即从部署(运行/调试)开始),它可以正常工作,但是当我强制停止应用程序时,小部件不再正常工作

当应用程序被强制停止时,小部件的第一次单击工作正常,并调用相应活动的onCreate。然后,当按下home键并按下另一个小部件按钮时,调用上一个小部件活动的onRestart方法

奇怪的是,b/c日志消息没有出现,而且由于调试器无法连接,所以测试起来相当困难。我有什么特别的地方做错了吗

流程是-->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=安卓.intent.action.MAIN cat=[安卓.intent.category.HOME] flg=0x10200000 cmp=com.安卓.launcher/com.安卓.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.安卓.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:: == false

重新启动时查看活动:

protected void onRestart(){
        super.onRestart();
        Log.i(LOG_TAG,"ONRESTART");

        Log.i(LOG_TAG,"WIDGET LAUNCH:: == " + WidgetInfo.getInstance().wasLaunchedFromWidget());
                 ...
}

AndroidManifest:

<activity 安卓:name="com.xxx.xxx.ui.cards.ViewActivity" 安卓:label="@string/_view_title" 安卓:finishOnTaskLaunch="true" 安卓:clearTaskOnLaunch="true" 安卓:screenOrientation="portrait"/>

<activity 安卓:name="com.xxx.xxx.widget.WidgetDispatchActivity" 安卓:label="@string/widget_dispatch_title" 安卓:finishOnTaskLaunch="true"/>

共 (1) 个答案

  1. # 1 楼答案

    威梅尔

    强制关闭时阻止小部件工作的第一步是实现onDestroy()。在这里,您需要确保与WidgetHost、组成小部件通信的HostView和RemoteView进行通信

    此语句阻止WidgetHost从Android接收任何事件myHost是对象,通常是一个包含对小部件的引用的活动

    // Stop the Widgets from fidgeting
        myHost.stopListening();
        myHost = null;
    

    从那里,您将需要删除对可能有引用的任何HostView的任何引用。这只需抓取引用并将其设置为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(代表我的小部件的视图)。appWidgets数组是我的启动器正在跟踪的小部件列表。总的来说很简单

    使用Widget和WidgetHosts可能会有问题,具体取决于您的设置。上述正确的表述确实有助于减轻痛苦

    模糊逻辑