我現在正在爲Android編寫電池控件。但問題是,我在我的服務中註冊了兩個BroadcastReceivers。我開始我的AppWidgetProvider的onEnable()方法的服務,並停止onDisable()。該服務旨在監聽電池狀態更新和方向更改,並通過將我的自定義Intent發送到我的AppWidgetProvider來通知widget更新自身。由於廣播(battery_state_changed和configuration_changed)無法由普通AppWidgetProvider接收,並且AppWidgetProvider無法註冊BroadcastReceivers本身。BroadcastReceiver不時在我的服務中工作,爲什麼?
這一切正常工作一兩天。但有時候,當電池狀態發生改變時,小部件並沒有自行更新,似乎我服務中的接收器無法工作,或者定製Intent突然成功停止到達我的AppWidgetProvider。
任何想法爲什麼會發生這種情況?
package com.carllee.widgets.kittenbatterywidget;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
public class BatteryStateMoniterService extends Service {
private static final String TAG = "BatteryStateMoniterService";
private BatteryStateReceiver batteryStateReceiver;
private OrientationChangeReceiver orientationChangeReceiver;
@Override
public void onCreate() {
super.onCreate();
Logger.log(TAG, "onCreate");
}
@Override
public void onDestroy() {
super.onDestroy();
if (batteryStateReceiver == null) {
this.unregisterReceiver(batteryStateReceiver);
}
if (orientationChangeReceiver == null) {
this.unregisterReceiver(orientationChangeReceiver);
}
Logger.log(TAG, "onDestroy");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (batteryStateReceiver == null) {
registerBatteryStateReceiver();
}
if (orientationChangeReceiver == null) {
registerOrientationChangeReceiver();
}
Logger.log(TAG, "onStartCommand");
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void registerBatteryStateReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
filter.addAction(Intent.ACTION_BATTERY_LOW);
filter.addAction(Intent.ACTION_BATTERY_OKAY);
batteryStateReceiver = new BatteryStateReceiver();
this.registerReceiver(batteryStateReceiver, filter);
}
private void registerOrientationChangeReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_CONFIGURATION_CHANGED);
orientationChangeReceiver = new OrientationChangeReceiver();
this.registerReceiver(orientationChangeReceiver, filter);
}
}
是的,謝謝你,但是startForeground()需要一個Notification參數,這會在狀態欄中發出一個通知(如果我沒有記錯的話),應用程序小部件每次都會發出通知沒有任何意義它被添加到啓動器。有沒有更好的解決方案來阻止我的服務被殺?或者我應該只傳遞null來startForeground()?或者有什麼辦法可以阻止狀態欄中顯示通知? – CarlLee 2011-04-22 03:19:48
嗨,我找到了一個解決方案,似乎工作,不知道它是否有效,我還在測試。解決方法是調用「setForeground(true);」 ,這將服務設置爲前臺,而不在狀態欄中顯示任何消息。 – CarlLee 2011-04-22 05:41:44