我正在嘗試使用AlarmManager類創建我的第一個AppWidget,以便我可以比每隔30分鐘更頻繁地進行更新。我遵循this tutorial作爲設置我的小部件的基礎,但出於某種原因,我無法讓更新正常開始。看起來我從來沒有收到任何APPWIDGET_ENABLED意圖,這會在我的AppWidgetProvider中觸發onEnabled事件回調。Android AppWidget未收到APPWIDGET_ENABLED意圖
這裏是我的AppWidgetProvider清單定義:
<receiver
android:name="com.myapp.android.appwidget.MarketTimingAppWidgetProvider"
android:label="@string/appwidget_markettiming_label">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
<action android:name="@string/appwidget_markettiming_updateintent" />
</intent-filter>
<meta-data android:name="android.appwidget.provider"
android:resource="@xml/appwidget_markettiming_info" />
</receiver>
這裏是我的AppWidgetProvider代碼:
public class MarketTimingAppWidgetProvider extends AppWidgetProvider {
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
final int N = appWidgetIds.length;
Log.d("myLogger", "onUpdate");
// Perform this loop procedure for each App Widget that belongs to this provider
for (int i=0; i<N; i++) {
int appWidgetId = appWidgetIds[i];
Log.d("myLogger", "Updating Widget: " + appWidgetId);
updateWidget(context, appWidgetManager, appWidgetId);
}
}
@Override
public void onEnabled(Context context) {
super.onEnabled(context);
Log.d("myLogger", "onEnabled running");
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 1);
alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(),
1000, createClockIntent(context));
}
public void onDisabled(Context context) {
super.onDisabled(context);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(createClockIntent(context));
}
public void onReceive(Context context, Intent intent) {
super.onReceive(context, intent);
Log.d("myLogger", "Intent Received " + intent.getAction());
String widgetIntent = context.getResources().getString(R.string.appwidget_markettiming_updateintent);
// This code fires when my custom intent is received
if(widgetIntent.equals(intent.getAction())) {
ComponentName thisAppWidget = new ComponentName(context.getPackageName(), getClass().getName());
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
int ids[] = appWidgetManager.getAppWidgetIds(thisAppWidget);
for(int appWidgetId: ids) {
updateWidget(context, appWidgetManager, appWidgetId);
}
}
}
private void updateWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.appwidget_markettiming);
views.setTextViewText(R.id.widget_text, "Update: " +
DateFormat.getDateTimeInstance(
DateFormat.LONG, DateFormat.LONG).format(new Date()));
// Tell the AppWidgetManager to perform an update on the current app widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
private PendingIntent createClockIntent(Context context) {
String updateIntent = context.getResources().getString(R.string.appwidget_markettiming_updateintent);
Log.d("myLogger", "my intent: " + updateIntent);
Intent intent = new Intent(updateIntent);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
}
當我的logcat看這是唯一的目的我的onReceive方法收到的是最初的APPWIDGET_UPDATE意圖,並且唯一執行的回調是onUpdate回調。我已經嘗試在我的appwidget意圖過濾器中包含APPWIDGET_ENABLED意圖(儘管文檔告訴我應該由我的窗口小部件自動接收)。它沒有工作。有沒有我在這裏失蹤的東西?
嗯,我沒有得到這個意圖的原因,但至少它很高興知道代碼的結構像我認爲它應該是。小部件上的TextView是否每秒更新一次? – mclark1129
不,只有一次。現在我去睡覺了,但明天會嘗試抽出時間仔細查看代碼。我目前也在學習使用App Widgets,所以會一起查找錯誤。 :) –
所以我發現,當我從模擬器中完全卸載應用程序,然後重新安裝它,然後啓用事件。我想這意味着我不明白何時這個意圖會被解僱。我認爲這將是任何時候一個小部件的第一個實例被添加到主屏幕。如果我刪除它並再次添加它,我會想象應該再次啓用啓用的意圖。 – mclark1129