我现在正在为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