我正在研究一個應用程序,它會通知我(通過播放鈴聲)電池電量已達到特定級別。級別是可配置的。爲此,我創建了一個啓動服務的活動,該服務又將一個接收器註冊爲ACTION_BATTERY_CHANGED。 MyActivity - >爲MyService - > MyBrodcastReceiver [ACTION_BATTERY_CHANGED] - >的onReceive() - >如果(電池電量< = myvalue的) - >播放鈴聲當屏幕/ CPU關閉時,不會調用Broadcast Receiver onReceive方法
一切工作正常,只要屏幕上,但一旦手機被鎖定屏幕熄滅或cpu睡眠廣播接收器的onReceive方法不會被調用,當我再次解鎖手機時,一切正常。我用日誌記錄驗證了這一點
是否僅當手機屏幕打開時纔會調用ACTION_BATTERY_CHANGED的onReceive方法,並在電話睡眠時停止?
我甚至在的onReceive方法使用喚醒鎖嘗試,但沒有奏效
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
public class BatteryMeterService extends Service {
private BatteryStatusReceiver batteryStatusReceiver;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
batteryStatusReceiver = new BatteryStatusReceiver(null);
registerReceiver(batteryStatusReceiver, intentFilter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(batteryStatusReceiver);
}
}
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.BatteryManager;
import android.os.PowerManager;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.util.Log;
import android.widget.TextView;
import com.amol.bm.BatteryMeterUtility.NotificationInfo;
public class BatteryStatusReceiver extends BroadcastReceiver {
private BatteryMeterUtility batteryMeterUtility;
public BatteryStatusReceiver() {
super();
}
@Override
public void onReceive(Context context, Intent intent) {
int level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float fPct = (level/(float)scale) * 100;
int levelPct = (int)fPct;
boolean prefAlertLowBattery = sharedPrefs.getBoolean("prefAlertLowBattery", true);
if(prefAlertLowBattery) {
String prefAlertLowBatteryValue = sharedPrefs.getString("prefAlertLowBatteryValue", "20");
int lowBatteryValue = Integer.parseInt(prefAlertLowBatteryValue);
if(levelPct <= lowBatteryValue && iStatus != BatteryManager.BATTERY_STATUS_CHARGING) {
notificationInfo.icon = R.drawable.low_battery;
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "BM WakeLook");
wakeLock.acquire();
batteryMeterUtility.playAlertRingtone(alertRingtone);
wakeLock.release();
}
}
}
}
您可以在清單和檢查中定義WAKE_LOCK的權限。 – user1721904 2013-05-07 05:10:18
您是否在代碼中的任何地方註銷接收器?可能在onPause? – user1721904 2013-05-07 05:27:20
不是在onPause中,而是在服務的OnDestroy中,但我通過日誌檢查了服務的onDestroy沒有被調用。 – 2013-05-07 05:35:10