2011-11-19 108 views
0

我正在嘗試使用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意圖(儘管文檔告訴我應該由我的窗口小部件自動接收)。它沒有工作。有沒有我在這裏失蹤的東西?

回答

2

您的清單中存在錯誤。在這個元素中的動作名稱:

<action android:name="@string/appwidget_markettiming_updateintent" /> 

應該被實際字符串替換,而不是引用。所以它應該是這樣的:<string name="appwidget_markettiming_updateintent">元素中

<action android:name="com.myapp.android.appwidget.action.MARKETTIMING_UPDATE" /> 

或任何你在你的價值觀/ something.xml。

問題是BroadcastReceiver沒有收到來自AlarmManager的廣播。我用你的代碼創建了一個項目,在manifest中只替換了這個字符串(並且當然在values/strings.xml中添加了適當的值),並且所有工作都正常。

另外,您可能需要將alarmManager.setRepeating()的第二個參數替換爲System.currentTimeMillis() + 1000,並刪除所有與日曆相關的額外內容。

+0

嗯,我沒有得到這個意圖的原因,但至少它很高興知道代碼的結構像我認爲它應該是。小部件上的TextView是否每秒更新一次? – mclark1129

+0

不,只有一次。現在我去睡覺了,但明天會嘗試抽出時間仔細查看代碼。我目前也在學習使用App Widgets,所以會一起查找錯誤。 :) –

+0

所以我發現,當我從模擬器中完全卸載應用程序,然後重新安裝它,然後啓用事件。我想這意味着我不明白何時這個意圖會被解僱。我認爲這將是任何時候一個小部件的第一個實例被添加到主屏幕。如果我刪除它並再次添加它,我會想象應該再次啓用啓用的意圖。 – mclark1129

1

顯然從模擬器中卸載它,然後重新安裝它的伎倆。現在,當我添加APPWIDGET_ENABLE意圖時,添加一個小部件,並且當我刪除它時,APPWIDGET_DISABLED意圖就像我所期望的那樣被觸發。我仍然有一個問題,那就是報警管理器並沒有像我期望的那樣真正開啓我的定製意圖,但這是我需要研究的一個單獨問題。