2014-05-19 73 views
0

我有下一個Widget代碼。AlarmManager每次更新

public class MainActivity extends AppWidgetProvider { 

public String FORCE_APDATA="com.example.widjet.FORCE_UDATA_SUKA"; 

public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidget){ 

    RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.widget); 
    AppWidgetManager appManager=AppWidgetManager.getInstance(context); 
    remoteViews.setViewVisibility(R.id.textView1, View.GONE); 
    remoteViews.setViewVisibility(R.id.PB1, View.VISIBLE); 
    appManager.updateAppWidget(appWidget, remoteViews); 
    Citata c=new Citata(); 
    String citats=""; 

     try { 
      citats = String.valueOf(c.getCitata()); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 


    remoteViews.setTextViewText(R.id.textView1, citats);    

    Intent intent=new Intent(context,MainActivity.class); 
    intent.setAction(FORCE_APDATA); 

    PendingIntent pIntent=PendingIntent.getBroadcast(context, 0, intent, 0); 

    remoteViews.setOnClickPendingIntent(R.id.textView1, pIntent); 


    AlarmManager alarmManager=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 
            60*60*1000, 
            (60*60*1000)/2,          
            pIntent); 
    remoteViews.setViewVisibility(R.id.textView1, View.VISIBLE); 
    remoteViews.setViewVisibility(R.id.PB1, View.GONE); 
    appManager.updateAppWidget(appWidget, remoteViews); 
} 

public void onReceive(Context context, Intent intent){ 
    super.onReceive(context, intent); 
    if(FORCE_APDATA.equals(intent.getAction())){ 

     AppWidgetManager appManager=AppWidgetManager.getInstance(context); 
     ComponentName thisWidget=new ComponentName(context.getApplicationContext(),MainActivity.class); 
     int[] appWidgetIds=appManager.getAppWidgetIds(thisWidget); 
     onUpdate(context,appManager,appWidgetIds); 

    } 
} 
} 

功能c.getCitata()睡眠2秒鐘,然後返回日期。 但是,當我啓動這個小部件時,我只能看到ProgressBar。如果刪除AlarmManager,所有工作和更新何時觸摸小部件。我做錯了什麼?

+0

爲了清楚起見,您有一個OnClick掛起的意圖,它將優先於MainActivity.class類。您還有一個AlarmManager,它也會在小部件第一次點擊一小時後發送PendingIntent來打開MainActivity.class,在此之後的30分鐘。你究竟想在這裏實現什麼? –

+0

我想,如果我點擊小部件,他會開始更新,小部件每30分鐘更新一次,但現在(在此代碼中)小部件每秒更新一次。我犯了什麼錯誤? – missing17

回答

0

我需要檢查這是因爲我遠離電腦,但你需要通過System.currentTimeInMillis()增加第二個參數。我認爲正在發生的事情是,警報正在檢測到過去觸發的時間,因此它立即啓動。您需要更改:

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, 60*60*1000, (60*60*1000)/2, pIntent); 

要:

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeInMillis() + 60*60*1000, (30*60*1000), pIntent); 

不過,既然你要設置報警每次小部件更新,可我建議你從setRepeating設置改變這一點。否則,目前發生的事情是,您的小部件將每小時更新一次。改用Alarm Manager.set。

編輯:在閱讀您的評論之後,請嘗試使用AlarmManager.set,與之前使用的類似。

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+30*60*1000, pIntent); 

,或者如果您希望使用不同的模式,按您的評論,這樣做:

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealTime()+30*60*1000, pIntent); 

這將發送每30分鐘的PendingIntent,這將在你的widget調用的onUpdate()這將發送PendingIntent等。

在使用AlarmManager時,您必須實現可以使用的不同模式,因爲每個模式都需要提供不同的時間定義。 AlarmManager.RTC & AlarmManager.RTC_WAKEUP要求使用自Epoch開始以來的系統時間定義開始時間段。 AlarmManager.ELAPSED_REALTIME & AlarmManager.ELAPSED_REALTIME_WAKEUP需要使用自啓動以來的時間(SystemClock.elapsedRealTime())來定義啓動時間。因此,在兩種情況下,您都要定義GLOBAL時間的開始時間,即內部時鐘在時間A,您希望鬧鐘在30分鐘內刷新小部件,因此您必須通知AlarmManager在A + 30分鐘內發送PendingIntent 。 AlarmManager.setRepeating還需要第三個參數,這是繼續發送PendingIntent的後續增量。這可以在LOCAL時間內定義,即僅在30分鐘內沒有GLOBAL時間增量。

我希望這已經夠清楚了。編輯:我在這裏做的一個建議是,在一個Utils類中定義你的時間增量作爲一個STATIC FINAL變量,例如:

public class Utils { 
    public static final int WIDGET_UPDATE_INTERVAL = 30*60*1000; 
} 

這給你一個簡單的方法來調整一個地方的時間間隔,而不必每次修改方法中的代碼。你的報警線然後變成:

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+Utils.WIDGET_UPDATE_INTERVAL, pIntent); 

相信我,這樣做可以使生活更容易進一步順利。

+0

我改變我的'alarmManager.set(AlarmManager.ELAPSED_REALTIME代碼,\t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t AlarmManager.INTERVAL_FIFTEEN_MINUTES, \t \t \t \t \t \t \t \t \t \t pIntent);',現在應用程序等待30分鐘,並開始每秒更新一次。 – missing17

+0

所以仍然不是你想要的? –

+0

我已經更新了答案並添加了更多說明(希望)! –

0
PendingIntent.getBroadcast 

應與廣播意圖一起使用。對於激活,請使用PendingIntent.getActivity

+0

更新已停止,但'remoteViews.setOnClickPendingIntent(R.id.textView1,pIntent);'不工作 – missing17

+0

不,我使用廣播。如果使用'PendingIntent.getActivity'小部件不起作用。 – missing17