2011-03-29 71 views
7

我試圖更頻繁地更新Widget,而不是1.6docs施加的30分鐘限制。在閱讀了幾乎每篇文章,開發人員文檔和其他各種資源後,我認爲自己已經達到了可以實施它的程度。所以,我嘗試了,失敗了。從那以後,我已經瀏覽了更多的論壇和解決方案,我似乎無法得到它的更新。使用AlarmManager更新應用程序窗口小部件

我有一個更新類設置AlarmManager:

public class Update extends Service{ 

    @Override 
    public void onStart(Intent intent, int startId) { 
      String currentTemp = Battery.outputTemp; 
      String currentLevel = Battery.outputLevel; 
      String currentCard = Battery.outputCard; 
      String currentInternal = Battery.memory; 
      String currentRam = String.valueOf(Battery.outputRam).substring(0, 3) + "MB"; 

      // Change the text in the widget 
      RemoteViews updateViews = new RemoteViews( 
      this.getPackageName(), R.layout.main); 
      //update temp 
      updateViews.setTextViewText(R.id.batteryTemp, currentTemp); 
      //update % 
      updateViews.setTextViewText(R.id.batteryLevel, currentLevel);  
      //update level 
      updateViews.setTextViewText(R.id.sdCard, currentCard); 
      //update internal memory 
      updateViews.setTextViewText(R.id.internal, currentInternal); 
      //update ram 
      updateViews.setTextViewText(R.id.ram, currentRam); 

      ComponentName thisWidget = new ComponentName(this, Widget.class); 
      AppWidgetManager manager = AppWidgetManager.getInstance(this); 
      manager.updateAppWidget(thisWidget, updateViews); 

    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     // no need to bind 
     return null; 
    } 

} 

這引起我的onReceive在我的窗口小部件類頻繁開火(我有一個敬酒看到火災時),但它沒有攜帶意圖(吐司是爲了顯示這個,因爲他們收到,但它是空白的)。

我無法弄清楚(我是一個相對newb-2個月的慢的android開發),並感謝您有任何見解。

我的繼承人蔘考widget類:

public class Widget extends AppWidgetProvider { 


    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, 
      int[] appWidgetIds) { 

     AlarmManager alarmManager; 
     Intent intent = new Intent(context, Update.class); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, 
       intent, PendingIntent.FLAG_UPDATE_CURRENT); 
     alarmManager = (AlarmManager) context 
       .getSystemService(Context.ALARM_SERVICE); 
     Calendar cal = Calendar.getInstance(); 
     cal.setTimeInMillis(System.currentTimeMillis()); 
     cal.add(Calendar.SECOND, 10); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal 
       .getTimeInMillis(), 5 * 1000, pendingIntent); 

     String currentTemp = Battery.outputTemp; 
     String currentLevel = Battery.outputLevel; 
     String currentCard = Battery.outputCard; 
     String currentInternal = Battery.memory; 
     String currentRam = String.valueOf(Battery.outputRam).substring(0, 3) 
       + "MB"; 

     // Change the text in the widget 
     RemoteViews updateViews = new RemoteViews(context.getPackageName(), 
       R.layout.main); 
     // update temp 
     updateViews.setTextViewText(R.id.batteryTemp, currentTemp); 
     appWidgetManager.updateAppWidget(appWidgetIds, updateViews); 
     // update % 
     updateViews.setTextViewText(R.id.batteryLevel, currentLevel); 
     appWidgetManager.updateAppWidget(appWidgetIds, updateViews); 
     // update level 
     updateViews.setTextViewText(R.id.sdCard, currentCard); 
     appWidgetManager.updateAppWidget(appWidgetIds, updateViews); 
     // update internal memory 
     updateViews.setTextViewText(R.id.internal, currentInternal); 
     appWidgetManager.updateAppWidget(appWidgetIds, updateViews); 
     // update ram 
     updateViews.setTextViewText(R.id.ram, currentRam); 
     appWidgetManager.updateAppWidget(appWidgetIds, updateViews); 
     super.onUpdate(context, appWidgetManager, appWidgetIds); 

    } 

    public void onReceive(Context context, Intent intent) { 

     super.onReceive(context, intent); 
     Toast 
       .makeText(context, intent.getAction() + context, 
         Toast.LENGTH_LONG).show(); 
     Bundle extras = intent.getExtras(); 
     if (extras != null) { 
      AppWidgetManager appWidgetManager = AppWidgetManager 
        .getInstance(context); 
      ComponentName thisAppWidget = new ComponentName(context 
        .getPackageName(), Widget.class.getName()); 
      int[] appWidgetIds = appWidgetManager 
        .getAppWidgetIds(thisAppWidget); 

      onUpdate(context, appWidgetManager, appWidgetIds); 
     } 

    } 
} 
+3

這是我幾年前的問題,關於我的第一個android程序(的確是我的第一個編程項目之一)。哦,它是如何讓我看看我以前的代碼。 – doydoy 2013-10-30 11:04:39

回答

12

我有一個更新類設置AlarmManager:

不,你不知道。代碼片段中無處顯示AlarmManager

在第二個代碼片段中有對AlarmManager的引用。問題有很多,包括:

  • 每次要設定新的重複報警的應用程序插件更新

  • 你就報警,這是絕對的瘋狂設定一個5秒的頻率

  • 你正在設置一個5秒鐘頻率的鬧鐘,我認爲這是您在某些司法轄區的逮捕理由

  • 您有一個毫無意義的onReceive()方法,甚至忽略了臨時Toast

  • 我們假定你是會有的Intent動作串在你Toast,但是當你創建你把PendingIntentIntent你不指定操作字符串鬧鐘

  • 你的代碼指的是我認爲是Battery類的靜態數據成員,但它很可能都是空/空......或者至少它們是,如果你有一個合理的頻率在鬧鐘上

+0

感謝您的迴應。 首先,我測試一個5秒的頻率,當我最終得到這個工作時,會將頻率降低到我想要的1分鐘頻率。 您提到使用'_WAKEUP'警報並不合適。你能詳細說明一下嗎?爲什麼不是,也許爲什麼別的會更好? – doydoy 2011-03-30 10:06:40

+1

@Ben Bullock:'_WAKEUP'鬧鐘會喚醒手機。即使在一分鐘的輪詢週期中,您也會嚴重地損耗用戶的電池。 – CommonsWare 2011-03-30 10:39:32

+0

哦,好吧,我誤解了,我認爲這意味着它只有在手機醒來時才起作用。 – doydoy 2011-03-30 11:27:57

12

這是我的解決方案,如何比30分鐘更頻繁地自動更新小部件。我使用AlarmManager。在使用AlarmManager刷新appwidget之前,請確保您知道您的操作,因爲此技術可能會耗盡設備的電池。

在Android文檔中詳細瞭解widget update - 特別是關於updatePeriodMillis參數。

這是我的Manifest.xml的一部分。我定義了自定義操作AUTO_UPDATE。

<receiver android:name=".appwidget.AppWidget" > 
    <intent-filter> 
     <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="AUTO_UPDATE" /> 
    </intent-filter> 
    <meta-data android:name="android.appwidget.provider" android:resource="@xml/appwidget_info" /> 
</receiver> 

這是我的AppWidget.java的一部分。在onReceive方法中,我處理自定義操作AUTO_UPDATE。在onEnabled和onDisabled方法中,我開始/停止警報。

public class AppWidget extends AppWidgetProvider 
{ 
    public static final String ACTION_AUTO_UPDATE = "AUTO_UPDATE"; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     super.onReceive(context, intent); 

     if(intent.getAction().equals(ACTION_AUTO_UPDATE)) 
     { 
      // DO SOMETHING 
     } 

     ... 
    } 

    @Override 
    public void onEnabled(Context context) 
    { 
     // start alarm 
     AppWidgetAlarm appWidgetAlarm = new AppWidgetAlarm(context.getApplicationContext()); 
     appWidgetAlarm.startAlarm(); 
    } 

    @Override 
    public void onDisabled(Context context) 
    { 
     // TODO: alarm should be stopped only if all widgets has been disabled 

     // stop alarm 
     AppWidgetAlarm appWidgetAlarm = new AppWidgetAlarm(context.getApplicationContext()); 
     appWidgetAlarm.stopAlarm(); 
    } 

    ... 
} 

這是我的AppWidgetAlarm.java,它啓動/停止報警。鬧鐘管理器向AppWidget發送廣播。

public class AppWidgetAlarm 
{ 
    private final int ALARM_ID = 0; 
    private final int INTERVAL_MILLIS = 10000; 

    private Context mContext; 


    public AppWidgetAlarm(Context context) 
    { 
     mContext = context; 
    } 


    public void startAlarm() 
    { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.add(Calendar.MILLISECOND, INTERVAL_MILLIS); 

     Intent alarmIntent = new Intent(AppWidget.ACTION_AUTO_UPDATE); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, ALARM_ID, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

     AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); 
     // RTC does not wake the device up 
     alarmManager.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), INTERVAL_MILLIS, pendingIntent); 
    } 


    public void stopAlarm() 
    { 
     Intent alarmIntent = new Intent(AppWidget.ACTION_AUTO_UPDATE); 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, ALARM_ID, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT); 

     AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(pendingIntent); 
    } 
} 
+0

你好 - 我嘗試你的鬧鐘示例,但onReceive()永遠不會獲得ACTION_AUTO_UPDATE廣播。任何想法爲什麼? – wufoo 2013-03-27 20:58:25

+0

看看我的AppWidgetAlarm.startAlarm()方法。我創建了pendingIntent,它應該發送ACTION_AUTO_UPDATE廣播。該意圖由警報事件執行。檢查您的鬧鐘是否有效。 – petrnohejl 2013-03-28 09:32:15

+0

仍然無法正常工作。如果您會這麼友好,請在pastebin(http://pastebin.com/mr4Gih0i)上查看我的代碼。 ----編輯:只注意到代碼的問題。我會修復它,但我忘了粘貼在appWidgetAlarm類:/ – wufoo 2013-03-28 14:20:00

相關問題