2011年1月11日 星期二

Android Service 定時自動執行

在Android讓widget自動更新其實可以直接寫在widget Provider的onUpdate裡就行了
但是後面的版本並不能設定update的時間,他已經被設定成30分鐘更新一次
所以如果要讓widget自動更新比較好的做法事建立一個Service並註冊一個AlarmManager設定定時執行的間隔時間
以下為範例
在Service中定義一個PendngIntent

public static PendingIntent serviceIntent = null;

在Service中定義註冊AlarmManager的Function

public static void registerService(Context context) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

//如果serviceIntent不為null(已註冊過)
if (serviceIntent != null)
alarmManager.cancel(serviceIntent); //清除

final int updateInterval = 60 * 60000;//間隔時間單位為ms

//間隔時間不為0
if (updateInterval != 0) {
//如果serviceIntent為null

if (serviceIntent == null) {
//建立intent
Intent intent = new Intent(context, 要更新的Service.class);
//建立serviceIntent
serviceIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
//在AlarmManager設定重覆執行的Server的intent
alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + updateInterval,
updateInterval, serviceIntent);
}
}

在Service中定義取消AlarmManager註冊

public static void removeService(Context context) {
if (serviceIntent != null) {
((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).cancel(serviceIntent);
serviceIntent = null;
}
}


最後在Widget實作onEnabled和onDisabled兩個Function
各別在裡面呼叫registerService和removeService即可


@Override
public void onDisabled(Context context) {
// TODO Auto-generated method stub
UpdateService.removeService(context);

super.onDisabled(context);
}

@Override
public void onEnabled(Context context) {
// TODO Auto-generated method stub
UpdateService.registerService(context);
super.onEnabled(context);
}