Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android应用程序小部件的生命周期_Android_Android Appwidget_Android Lifecycle - Fatal编程技术网

android应用程序小部件的生命周期

android应用程序小部件的生命周期,android,android-appwidget,android-lifecycle,Android,Android Appwidget,Android Lifecycle,我的应用程序小部件有问题。我已经创建了一个包含6个按钮的应用程序小部件,我用6个操作(在manifest和onUpdate()方法中)完成了这6个按钮。因为如果用户按下其中一个按钮,我可以对此做出反应。但是在一段默认时间后,我没有得到响应,听起来好像appwidgetmanager不工作了 问题是,如果我将设备连接到pc,它可以正常工作,例如1周,但当我以正常方式使用智能手机时(我没有将其连接到pc,我使用了一整天),在一天结束时appwidget没有响应,按钮没有响应 小部件必须只显示一些文本

我的应用程序小部件有问题。我已经创建了一个包含6个按钮的应用程序小部件,我用6个操作(在manifest和onUpdate()方法中)完成了这6个按钮。因为如果用户按下其中一个按钮,我可以对此做出反应。但是在一段默认时间后,我没有得到响应,听起来好像appwidgetmanager不工作了

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

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

现在的问题是:我是否必须实现updateperiod,我是否可以证明appwidget在一天结束时仍然有效,或者这是其他问题

问候
Manu

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

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


这可能是安卓系统的一个bug,也可能不是,但事实就是如此。

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

有许多原因导致系统会破坏挂起的意图,从而导致远程视图死机,并且所有这些原因都很难找到和理解,因此最佳做法是每隔一段时间更新一次小部件

我的研究表明,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
    }
}

希望这有助于…

不,我不会更新每个视图。我可能会想象。。。如果用户按btn 1,则我填充文本1,并设置gone的文本2、3、4、5、6的可见性,使用另一个,我以相同的方式执行。btn2->文本2->可见->文本1,3,4,5,6消失。如果这是一个错误。。。我不这么认为,因为其他应用程序小部件可以管理它们的生命周期…非常感谢您提供的详细答案。但有人会想:每15分钟更新一次,我就有点害怕内存泄漏,你有没有这样的经验,不用担心。内存泄漏是错误代码的结果,而不是更新时间的结果。只要你的代码是有效的和小的,你就没有什么可担心的。如果您的小部件在用户与它交互时有很多事情要做,那么您必须使用服务,但这是一个完全不同的问题。在用户按下按钮时更改某些视图可见性的情况下,可以使用15分钟的方法。担心小部件中的更新时间是可以的,但不是太多,最常见的小部件是那些时钟每分钟都在更新的小部件,没有明显的资源消耗。
...
    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 ....