【问题标题】:Lifetime of an android app widget安卓应用小部件的生命周期
【发布时间】:2013-06-24 20:25:17
【问题描述】:

我的应用小部件存在问题/问题。我创建了一个带有 6 个按钮的应用程序小部件,我将这 6 个按钮与 6 个操作组合在一起(在清单和 onUpdate() 方法中)。因为如果用户按下其中之一,我可以对此做出反应。但是在默认时间之后我没有得到响应,听起来 appwidgetmanager 无法正常工作。

问题是,如果我将设备连接到电脑,它可以工作,例如。 1 周,但是当我以正常方式使用智能手机时(我没有将它与电脑连接,我使用了一整天)在一天结束时 appwidget 没有响应,按钮没有响应。

小部件必须只显示一些文本,因此我禁用了更新周期 -> appwidget 在 onUpdate() 方法中只运行一次。

现在的问题:我必须实施更新期,我可以证明 appwidget 在一天结束时仍然存在还是其他问题/问题?

问候 手动

【问题讨论】:

    标签: android android-appwidget android-lifecycle


    【解决方案1】:

    最好将 updatePeriodMillis 设置为 900000 毫秒。这将每 15 分钟调用一次 onUpdate 方法。在 onUpdate 方法中,您可以“刷新”远程视图的待处理意图。您可以做的另一件事是在每次更改远程视图时执行小部件更新。例如,用户按下按钮执行您必须执行的操作,然后执行小部件更新。

    由于多种原因,系统会破坏待处理的 Intent,从而使您的远程视图失效,并且所有这些都很难找到和理解,因此最佳做法是每隔一段时间更新您的小部件。

    我的研究表明,15 分钟是一个很好的时间范围。例如,这是我的 onUpdate 方法,它每 15 分钟运行一次,用于具有许多按钮的小部件:

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Log.d(TAG, "onUpdate");
        super.onUpdate(context, appWidgetManager, appWidgetIds);
    
        FullWidgetPreferencesHelper wp;
    
        // If no specific widgets requested, collect list of all
        if (appWidgetIds == null) {
            appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(context, FullWidgetProvider.class));
        }
    
        for (int widgetId : appWidgetIds) {
            Commands.FullWidgetUpdate(context, widgetId, 0); //<-- Update το widgetId
        }
    }
    

    FullWidgetUpdate 方法是这样的:

    ...
        views.setInt(R.id.cmdwifi, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_topleft_black));
        views.setInt(R.id.cmdbluetooth, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
        views.setInt(R.id.cmddata, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
        views.setInt(R.id.cmdsync, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
        views.setInt(R.id.cmdflight, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
        views.setInt(R.id.cmdgps, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
        views.setInt(R.id.cmdorientation, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_middle_black));
        views.setInt(R.id.cmdvolume, "setBackgroundResource", ThemeResources.getThemeResource(themeId, R.drawable.btn_bck_topright_black));
    ...
            final int PendingIntentFLAG = PendingIntent.FLAG_UPDATE_CURRENT;
    
        Intent iWiFi = new Intent(cx, CommandsReceiver.class).setAction(CommandsReceiver.cmdwifi).setData(Uri.parse("custom:" + widgetID));
        PendingIntent piWiFi = PendingIntent.getBroadcast(cx, 0, iWiFi, PendingIntentFLAG);
        views.setOnClickPendingIntent(R.id.cmdwifi, piWiFi);
    
        Intent iBT = new Intent(cx, CommandsReceiver.class).setAction(CommandsReceiver.cmdbt).setData(Uri.parse("custom:" + widgetID));
        PendingIntent piBT = PendingIntent.getBroadcast(cx, 0, iBT, PendingIntentFLAG);
        views.setOnClickPendingIntent(R.id.cmdbluetooth, piBT);
    ... and so on for other buttons ....
    

    希望这会有所帮助...

    【讨论】:

    • 非常感谢您的详细回答。但有人想:每 15 分钟更新一次,我有点害怕内存泄漏,你有什么经验让你不必担心吗?
    • 内存泄漏是错误代码而不是更新时间的结果。只要您的代码高效且小巧,您就无需担心。如果您的小部件在用户与之交互时有很多事情要做,那么您必须使用服务,但这是完全不同的事情。在您在用户按下按钮时更改某些视图可见性的情况下,您可以采用 15 分钟的方法。不必担心小部件的更新时间,但不必担心,最常见的小部件是具有时钟的小部件,每分钟更新一次,没有明显的资源消耗。
    【解决方案2】:

    是否每次更新某个视图时都会更新小部件中的每个视图?

    上次我检查您必须每次都更新每个视图,否则视图迟早会变得无响应。换句话说,如果您有 6 个按钮和 2 个文本视图,并且您想要更新其中一个文本视图,您还需要更新另一个文本视图和按钮(当然,使用与您之前发送给它们的信息相同的信息)。

    这可能是也可能不是 Android 中的错误,但它就是这样。

    【讨论】:

    • 不,我不会更新每个视图。我可能会想象...如果用户按下 btn 1 然后我填充文本 1 并设置文本 2、3、4、5、6 的可见性,而另一个我走同样的路。 btn2 -> text2 -> visible -> text 1,3,4,5,6 消失了。如果这是一个错误......我不这么认为,因为其他应用小部件可以在那里管理生命周期......
    猜你喜欢
    • 2017-11-07
    • 1970-01-01
    • 2010-12-12
    • 2017-08-01
    • 1970-01-01
    • 2018-10-13
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多