Пишу виджет таймер, есть кнопка "Пауза" (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);
}
}