2014-02-20 61 views
0

我是一個Android小部件的新手。 我的問題是我的小部件沒有更新日期。不在onUpdate in AppWidgetProvider

這是一個只有日期的小部件,沒有更多。

請幫助我,我做錯了什麼。

注意:wedmarter:它看起來像你的文章主要是代碼;請添加更多的細節。但我不知道更多的信息。

package com.android.widget; 

import java.util.Timer; 
import java.util.TimerTask; 

import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.widget.RemoteViews; 

public class MyCalendarWidget extends AppWidgetProvider { 

    @Override 
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(new MyTime(context, appWidgetManager), 1, 
       1000); 
    } 

    private class MyTime extends TimerTask { 
     RemoteViews remoteViews; 
     AppWidgetManager appWidgetManager; 
     ComponentName thisWidget; 
     Fecha fec = new Fecha(); 

     public MyTime(Context context, AppWidgetManager appWidgetManager) { 
      this.appWidgetManager = appWidgetManager; 
      remoteViews = new RemoteViews(context.getPackageName(), R.layout.main); 
      thisWidget = new ComponentName(context, MyCalendarWidget.class); 
     } 

     @Override 
     public void run() { 
      remoteViews.setTextViewText(R.id.widget_textview, fec.DiaActual(false)+"\r\n" 
                  +fec.DiaActual(true) +" de " 
                  +fec.MesActual(false)+" de " 
                  +fec.AñoActualNumerico()); 
      appWidgetManager.updateAppWidget(thisWidget, remoteViews); 
     } 

    } 
} 

回答

1

請通過閱讀文檔,AppWidget GuideAppWidgetProvider開始。這解釋了:

  • 您的onUpdate()方法需要通過updateAppWidget()將RemoteViews發送到窗口小部件。
  • 每秒醒來一次會損耗電池。您肯定不想在手機正在睡覺時更新小部件。
  • 每次調用remoteViews.setTextViewText()都會將更多數據附加到RemoteViews對象。這會在內存中累積多餘的數據,並使部件變慢。相反,每次都要獲得一個新的RemoteViews實例。

我對你的更新沒有發生的假設是操作系統在提供者完成對Intent的響應時停止你的widget提供者的組件。你可以通過Log.d()來測試這個假設。

您可以註冊一個ACTION_TIME_TICK廣播,告訴你什麼時候改變,每分鐘一次。在電話休眠時測試它不運行(例如保持電話計數),並隨時在這裏報告。

[已有]在實踐中顯示日期(每天更新一次)比日期+時間要容易得多(每分鐘更新一次;問題代碼試圖每秒更新一次) ,並且在不使用太多電池電量的情況下這樣做。

  • Set updatePeriodMillis="0"
  • <action android:name="android.intent.action.DATE_CHANGED"/>添加到AndroidManifest.xml中的窗口小部件提供程序的<intent-filter>
  • 在的AppWidgetProvider,覆蓋

    public void onReceive(Context context, Intent intent) { 
        super.onReceive(context, intent); 
        if (Intent.ACTION_DATE_CHANGED.equals(intent.getAction())) { updateAllMyWidgets(context); } 
    } 
    
  • 使用DateUtils.formatDateTime()格式化的日期。

是的,如果時鐘向後調整,則會發生bug code.google.com/p/android/issues/detail?id=2880

+0

謝謝老師非常友好。 請想知道這個項目是否可以使用DEBUG。當我嘗試時它不起作用。 謝謝,雖然它幫助了我很多,因爲我是Android新手,他的解釋非常大。 如果你可以給我發一個ACTION_TIME_TICK這樣的例子的鏈接。我會永遠感激。 –

+0

調試器應該在這個項目上工作。如果您正在設備上運行,請記住使用設置來啓用包括調試功能在內的開發功能。 您可能想要開始一個更簡單的項目,只是使用活動。該項目需要學習小工具,意圖,接收者,服務等。 – Jerry101

+0

網頁搜索將使用ACTION_TIME_TICK找到示例[雖然其中一些設計不好],例如http://kfb-android.blogspot.com/2009/04/registering-for-timetick-after-reboot.html:' registerReceiver(新的DemoReceiver(),新的IntentFilter(Intent.ACTION_TIME_TICK));'它需要在一個服務中繼續在後臺運行。該頁面還討論了重新註冊設備何時重新啓動以及是否需要停止服務。我不認爲清單需要intent-filter中的「。 – Jerry101

相關問題