【问题标题】:What is the best way to update android widget on screen_on. Is it supported in Android Oreo (API 26)在 screen_on 上更新 android 小部件的最佳方法是什么。 Android Oreo (API 26) 是否支持
【发布时间】:2018-07-05 10:39:12
【问题描述】:

由于 Google Play 开发者控制台的要求,我创建了一个运行良好的小部件,然后我将 targetSDK 从 23 更改为 26。

切换到 Android SDK 26 后,我的应用小部件不再在 screen_on/User_present 事件上更新。我可以看到由于(后台执行限制),Android 26 对后台运行任务有很多变化。

以下是我的问题吗?

Q1- 如何在每个 screen_on 事件上更新我的应用小部件,以便用户在小部件上看到正确的状态?

Q2- 如何每隔 1 小时定期更新我的应用小部件?

以下代码我目前正在使用。

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.app_widget);
        String token = getToken();
        getUUID();
        getGatewayActivationStatus();
        getEnvironment();
        if (token != null) {
            remoteViews.setViewVisibility(R.id.layoutBtn, View.VISIBLE);
            AppWidgetIntentReceiver appWI = new AppWidgetIntentReceiver();
            appWI.getMode(context);
        } else {
            remoteViews.setTextViewText(R.id.txt_mode, "Please sign into your App to see status.");
            remoteViews.setViewVisibility(R.id.layoutBtn, View.INVISIBLE);
        }

        remoteViews.setOnClickPendingIntent(R.id.btn_refresh, buildButtonPendingIntent(context, _refresh));
        remoteViews.setOnClickPendingIntent(R.id.txt_mode, buildButtonPendingIntent(context, _openApp));

        appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
    }


    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId : appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onEnabled(Context context) {
        super.onEnabled(context);
    }

    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);//add this line
        AppWidgetIntentReceiver appWI = new AppWidgetIntentReceiver();

        if (_standby.equals(intent.getAction()) || _home.equals(intent.getAction()) || _away.equals(intent.getAction()) || _refresh.equals(intent.getAction()) || _openApp.equals(intent.getAction())) {
            appWI.handleClickEvent(context, intent, intent.getAction());

        } else if (intent.getAction().equals("android.intent.action.USER_PRESENT") || intent.getAction().equals("android.appwidget.action.APPWIDGET_ENABLED") || intent.getAction().equals("android.intent.action.MY_PACKAGE_REPLACED") || intent.getAction().equals("android.appwidget.action.APPWIDGET_UPDATE")) {

            getToken();
            getUUID();
            getGatewayActivationStatus();
            getEnvironment();
            appWI.handleClickEvent(context, intent, _refresh);

        }
    };

    static PendingIntent buildButtonPendingIntent(Context context, String event) {
        if (!event.equals("OPEN_APP")) {
            Intent intent = new Intent(context, AppWidgetProvider.class);
            intent.setAction(event);
            return PendingIntent.getBroadcast(context, 0, intent, 0);
        } else {
            Intent intent2 = new Intent(context, MainActivity.class);
            return PendingIntent.getActivity(context, 0, intent2, 0);
        }
    }

【问题讨论】:

  • 您是否尝试过 WorkManager 来安排作业?
  • 不,我尝试了警报管理器和服务来处理事件,但在 Android 26 中,一旦设备进入打盹模式,它就会停止所有后台服务。让我也检查一下 WorkManager。
  • @Qamar 您能否提供一些示例或链接,其中 SCREEN_ON 事件与 WorkManager 一起使用?
  • 他们在 workManager 后面使用 jobScheduler api,我没有看到任何 screen_on 或 user_present 事件支持。
  • 请分享github上的小例子

标签: java android cordova ionic-framework android-widget


【解决方案1】:

最后,我找到了解决这个问题的方法。

我们可以在这里找到答案:

https://developer.android.com/training/monitoring-device-state/doze-standby

为了解决上述问题,我们可以使用Alarm Manager。

标准 AlarmManager 警报(包括 setExact() 和 setWindow())被推迟到下一个维护窗口。

所以在打盹模式结束后,或者在维护窗口期间,它会自动执行代码,编写在警报管理器服务中。

您可以在此处获取帮助,以通过此 stackoverflow 帖子在您的小部件中使用警报管理器: https://stackoverflow.com/a/14319020/3497865

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 2015-01-29
    • 1970-01-01
    相关资源
    最近更新 更多