我正在研究一个应用程序,它会通知我(通过播放铃声)电池电量已达到特定级别。级别是可配置的。为此,我创建了一个启动服务的活动,该服务又将一个接收器注册为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