Проблема Виджет и AlarmManager

Интерфейс, диалоги, темы, стили, меню
Ответить
burovalex
Сообщения: 29
Зарегистрирован: 12 июл 2013, 12:11

Проблема Виджет и AlarmManager

Сообщение burovalex » 29 апр 2015, 08:35

Ребят, я видимо что-то не знаю про алармы и в связи с чем у меня такой баг.
Пишу виджет таймер, есть кнопка "Пауза" (buttonPause). Пайза работает, после блокировки и разблокировки тоже работает, после переходов и т.д. тоже норм. А вот после паузы большого промежутка времени перестает счетчик запускать - первое нажатие безрезультатно, после второго нажатия спрыгивает на ноль и пускает таймер.

Код: Выделить всё

package ru.avb.wtimer;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.RemoteViews;

public class MyWidget extends AppWidgetProvider {

    //==================================DECLARATE==================================================

    final String LOGTAG = "Widget";
    final String UPDATE_ALL_WIDGETS = "update_all_widgets";
    final String ACTION_RESET = "action_reset_";
    final String ACTION_PAUSE = "action_pause_";
    final String ACTION_MENU = "action_menu_";
    final String ACTION_SHOW_ITEMS = "action_show_items";

    public final static String 	WIDGET_PREF = "widget_pref";
    public final static String	WIDGET_INT = "widget_int_";
    public final static String	EXTRA_WIDGET_ID = "extra_widget_id";

    public static boolean 	isOptionsChanged,
                            isNeedFastUpdate;
    public final static int FAST_UPDATE_RATE = 30,
                           	ITEM_ALPHA_PERIOD = 500;	//in millis
    public static int 		time = 1;
    public static long 		lastMillis = System.currentTimeMillis(), millis;

    public static float 	itemSize = 0;
    public static long 		itemTimer = 0;
    public static boolean 	isItemShowed = false;
    public static boolean   isPaused = false;

    //=============================================================================================

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        // There may be multiple widgets active, so update all of them
        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            updateWidget(context, appWidgetManager, appWidgetIds[i]);
        }
    }

    @Override
    public void onEnabled(Context context) {
        lastMillis = System.currentTimeMillis();
        Log.i(LOGTAG,"Widget.onEnable()..");
        Intent intent = new Intent(context, MyWidget.class);
        intent.setAction(UPDATE_ALL_WIDGETS);
        PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000, pIntent);
    }

    @Override
    public void onDisabled(Context context) {
        super.onDisabled(context);
        Log.i(LOGTAG,"Widget.onDisabled()..");
        Intent intent = new Intent(context, MyWidget.class);
        intent.setAction(UPDATE_ALL_WIDGETS);
        PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        alarmManager.cancel(pIntent);
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        super.onReceive(context, intent);
        Log.i(LOGTAG, "Widget.onReceived()..");
        if (intent.getAction().equalsIgnoreCase(UPDATE_ALL_WIDGETS)) {
            Log.i(LOGTAG, "Widget.onReceived() Received action 'UPDATE_ALL_WIDGETS'.");
            ComponentName thisWidget = new ComponentName(context.getPackageName(), getClass().getName());
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            int IDs[] = appWidgetManager.getAppWidgetIds(thisWidget);
            for (int ID : IDs) {
                updateWidget(context, appWidgetManager, ID);
            }
        }
        //EXTRAS
        Bundle extras = intent.getExtras();
        if (extras != null) {
            int currID = intent.getIntExtra(EXTRA_WIDGET_ID,-1);
            if (intent.getAction().equalsIgnoreCase(ACTION_RESET)) {resetTimer(context, currID);}
            if (intent.getAction().equalsIgnoreCase(ACTION_PAUSE)) {pauseTimer(context);}
            if (intent.getAction().equalsIgnoreCase(ACTION_MENU))  {showMenu(context, currID);}
        }
    }

    public void pauseTimer(Context context) {
        Log.i(LOGTAG, "Widget.pauseTimer(): Button 'Pause' clicked.");
        isPaused = !isPaused;
        //Initial
        Intent intent = new Intent(context, MyWidget.class);
        intent.setAction(UPDATE_ALL_WIDGETS);
        PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        //If timer paused then delete alarm
        if (isPaused) {alarmManager.cancel(pIntent);}
        if (!isPaused) {
            lastMillis = System.currentTimeMillis();
            alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(), 1000, pIntent);
        }
    }

    public void updateWidget(Context context, AppWidgetManager appWidgetManager, int ID) {
        //Update timer
        millis = System.currentTimeMillis() - lastMillis;
        lastMillis = System.currentTimeMillis();
        time += millis;
        //Get and set views
        RemoteViews widgetViews = new RemoteViews(context.getPackageName(), R.layout.my_widget);

        widgetViews.setTextViewText(R.id.time, String.valueOf(time/1000) );
        //Events
        //Click on widget
        PendingIntent pIntent;
        Intent resetIntent = new Intent(context, MyWidget.class);
        resetIntent.setAction(ACTION_RESET);
        resetIntent.putExtra(EXTRA_WIDGET_ID, ID);
        pIntent = PendingIntent.getBroadcast(context, ID, resetIntent, 0);
        widgetViews.setOnClickPendingIntent(R.id.buttonReset, pIntent);

        Intent pauseIntent = new Intent(context, MyWidget.class);
        pauseIntent.setAction(ACTION_PAUSE);
        pauseIntent.putExtra(EXTRA_WIDGET_ID, ID);
        pIntent = PendingIntent.getBroadcast(context, ID, pauseIntent, 0);
        widgetViews.setOnClickPendingIntent(R.id.buttonPause, pIntent);

        Intent menuIntent = new Intent(context, MyWidget.class);
        menuIntent.setAction(ACTION_MENU);
        menuIntent.putExtra(EXTRA_WIDGET_ID, ID);
        pIntent = PendingIntent.getBroadcast(context, ID, menuIntent, 0);
        widgetViews.setOnClickPendingIntent(R.id.buttonMenu, pIntent);

        //Update widget
        appWidgetManager.updateAppWidget(ID, widgetViews);
    }
}

Ответить