當用戶按下電源按鈕( - >屏幕關閉)時,我試圖保存當前電池電量。鎖定屏幕不工作時保存當前電池電量
起初我有這將啓動每當手機啓動的廣播接收機。它的任務是啓動一個服務,該服務創建另一個廣播接收器用於屏蔽/打開意圖(因爲在清單中指定屏幕關閉意圖不會工作,我通過此服務動態創建它)
MyStartupReceiver
public class MyStartupReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context c, Intent i) {
if(i.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
{
Log.d("Boot completed", "Boot completed");
c.startService(new Intent(c, CreateReceiverService.class));
}
}
}
CreateReceiverService
public class CreateReceiverService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
filter.addAction(Intent.ACTION_BATTERY_CHANGED);
BroadcastReceiver mReceiver = new ScreenReceiver();
registerReceiver(mReceiver, filter);
Log.d("Service", "Receiver registered");
return super.onStartCommand(intent, flags, startId);
}
而這裏的ScreenRece艾弗
public class ScreenReceiver extends BroadcastReceiver {
private int lastBatteryLevel;
@Override
public void onReceive(Context c, Intent i) {
if(i.getAction().equals(Intent.ACTION_USER_PRESENT))
{
Log.d("Screen unlock", "Screen unlock");
}
else if(i.getAction().equals(Intent.ACTION_SCREEN_OFF))
{
Log.d("Screen off", "Screen off");
Intent s = new Intent(c, ActionService.class);
s.putExtra("LVL", lastBatteryLevel);
c.startService(s);
}
else if(i.getAction().equals(Intent.ACTION_BATTERY_CHANGED))
{
lastBatteryLevel = i.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
Log.d("Battery changed", "level = "+lastBatteryLevel);
}
}
現在我的問題: 的ActionService應該節省電池電量,以一個首選項文件: ActionService
public class ActionService extends Service {
private SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(this);
Editor e = p.edit();
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
e.putInt("LOCKLVL", intent.getIntExtra("LVL", -1));
e.commit();
Log.d("Saved preference", "saved "+p.getInt("LOCKLVL", -1));
return super.onStartCommand(intent, flags, startId);
}
的問題是,接收到屏幕關閉意圖時什麼也沒發生 - 我的ActionService,應該保存電池電量,不叫。
我logcat的輸出是:
Receiver registered
Screen off
和沒有輸出 ActionService的Log.d( 「保存偏好」, 「拯救 」+ p.getInt(「 LOCKLVL」,-1) );
我甚至嘗試設置激活鎖定這樣的: ScreenReceiver
else if(i.getAction().equals(Intent.ACTION_SCREEN_OFF))
{
WakelockHelper.acquireCpuWakeLock(c); //WAKELOCK TRY
Log.d("Screen off", "Screen off"); //OUTPUT OK
Intent s = new Intent(c, ActionService.class);
s.putExtra("LVL", lastBatteryLevel);
c.startService(s); //NOT CALLED
}
,並釋放其偏好保存後。 但這並沒有改變任何東西。
只要是完整的,這是我WakelockHelper
類public class WakelockHelper {
private static PowerManager.WakeLock sCpuWakeLock;
static void acquireCpuWakeLock(Context context) {
if (sCpuWakeLock != null) {
return;
}
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
sCpuWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"Tag");
sCpuWakeLock.acquire();
Log.i("Wakelock", "Wakelock set");
}
static void releaseCpuLock() {
if (sCpuWakeLock != null) {
sCpuWakeLock.release();
sCpuWakeLock = null;
Log.i("Wakelock", "Wakelock released");
}
}
}
所以,我怎麼能保存在用戶鎖定手機當前電池電量? 爲什麼我的服務無法在屏幕截圖後啓動? 爲什麼wakelock沒有改變什麼?
謝謝!