[英]onUpdate() not getting called for a widget?
我想制作一個CountDown計時器的Widget。 我想讓它每秒更新一次。 以下是我的代碼。 onUpdate()
除了在開頭一次之外沒有被調用。 請指出我的問題。 提前致謝。
JAVA代碼
public class MainActivity extends AppWidgetProvider {
private boolean isTimeComplete = false;
private int days, hours, minutes, seconds;
private PendingIntent pendingIntent;
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
AlarmManager alarmManager = (AlarmManager) context
.getSystemService(Context.ALARM_SERVICE);
Intent alarm = new Intent(context, MainActivity.class);
pendingIntent = PendingIntent.getService(context, 0, alarm,
PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
1000, pendingIntent);
ComponentName thisWidget = new ComponentName(context,
MainActivity.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(thisWidget,
new RemoteViews(context.getPackageName(),
R.layout.activity_main));
int appWidgetIds[] = manager.getAppWidgetIds(thisWidget);
manager.notifyAppWidgetViewDataChanged(appWidgetIds, R.id.text_value);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),
R.layout.activity_main);
ComponentName timerWidget = new ComponentName(context,
MainActivity.class);
SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss",
Locale.US);
Date d2 = null;
try {
d2 = format.parse("2014/10/04 10:00:00");
} catch (ParseException e) {
e.printStackTrace();
}
Calendar cal = Calendar.getInstance();
long diff = d2.getTime() - cal.getTime().getTime();
seconds = (int) (diff / 1000) % 60;
minutes = (int) ((diff / (1000 * 60)) % 60);
hours = (int) ((diff / (1000 * 60 * 60)) % 24);
days = (int) (diff / (1000 * 60 * 60 * 24));
remoteViews.setTextViewText(R.id.text_remaining,
context.getString(R.string.time_remaining_text));
remoteViews.setTextViewText(
R.id.text_value,
String.format(context.getString(R.string.text_days),
days)
+ " "
+ String.format(
context.getString(R.string.text_hours),
hours)
+ " "
+ String.format(context.getString(R.string.text_minutes),
minutes)
+ " "
+ String.format(context.getString(R.string.text_seconds),
seconds));
appWidgetManager.updateAppWidget(timerWidget, remoteViews);
}
}
提供者XML
<?xml version="1.0" encoding="utf-8"?>
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:initialLayout="@layout/activity_main"
android:minHeight="144dp"
android:minWidth="146dp"
android:updatePeriodMillis="1000" />
表現
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.poc_timerwidget"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver
android:name=".MainActivity"
android:label="Timer Widget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/timer_widget_provider" />
</receiver>
</application>
</manifest>
問題:
AppWidgetProvider
是一個BroadcastReceiver
。 您正在檢索啟動服務的PendingIntent
,而不是檢索發送廣播的PendingIntent
。 ACTION_APPWIDGET_UPDATE
的intent-filter。 但是,未對傳遞給警報管理器的待處理意圖設置操作AppWidgetManager.ACTION_APPWIDGET_UPDATE
。 您還需要在掛起的意圖上設置額外的AppWidgetManager.EXTRA_APPWIDGET_IDS
。 設置重復警報以更新小部件:
Intent alarm = new Intent(context, MainActivity.class);
alarm.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); // Set appwidget update action
alarm.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); // Set appwidget ids to be updated
pendingIntent = PendingIntent.getBroadcast(context, 0, alarm,
PendingIntent.FLAG_CANCEL_CURRENT); // get the broadcast pending intent
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis(),
1000, pendingIntent); // set repeat alarm
請記住將updatePeriodMillis
設置為0.來自docs :
將警報類型設置為ELAPSED_REALTIME或RTC,它僅在設備喚醒時發出警報。 然后將updatePeriodMillis設置為零(“0”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.