Каков наилучший способ обновить виджет Android на screen_on. Поддерживается ли это в Android Oreo (API 26) - PullRequest
0 голосов
/ 05 июля 2018

Я создал виджет, который работал довольно хорошо, а затем изменил targetSDK с 23 на 26, в соответствии с требованием консоли разработчика Google Play.

После переключения на Android SDK 26 виджет моего приложения больше не обновляется в событии screen_on / User_present. Я вижу, что в Android 26 есть множество изменений для фоновой задачи из-за (Фоновое ограничение выполнения).

Следите за моими вопросами?

В1. Как я могу обновлять виджет моего приложения при каждом событии 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);
        }
    }

1 Ответ

0 голосов
/ 17 октября 2018

Наконец-то я нашел решение этой проблемы.

Мы можем просто найти ответ здесь:

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

Чтобы решить вышеуказанную проблему, мы можем использовать Alarm Manager.

Стандартные тревоги AlarmManager (включая setExact () и setWindow ()) откладываются до следующего окна обслуживания.

Таким образом, сразу после завершения режима ожидания или во время периода обслуживания он автоматически выполнит код, записанный в диспетчере аварийных сигналов.

Здесь вы можете получить помощь по использованию диспетчера тревог в вашем виджете из этого сообщения stackoverflow: https://stackoverflow.com/a/14319020/3497865

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...