사용자가 전원 버튼 (-> 화면 꺼짐)을 누르면 현재 배터리 수준을 저장하려고합니다.잠금 화면이 작동하지 않을 때 현재 배터리 잔량을 저장하십시오.
처음에는 전화가 부팅 될 때마다 시작되는 브로드 캐스트 수신기가 있습니다. 이것은 화면 오프/인 텐트를위한 또 다른 브로드 캐스트 리시버를 만드는 서비스를 시작하는 것입니다 (- 매니 페스트에 화면을 지정하지 않으면 스크린 인 텐트가 작동하지 않으므로이 서비스를 통해 동적으로 생성합니다)
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가 호출되지 않습니다.
내 로그 캣 출력은 : 더 출력 ActionService의 Log.d ("저장된 기본 설정"에서, + p.getInt ("LOCKLVL"을 "저장되지"
Receiver registered
Screen off
및 , -1));
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
}
ScreenReceiver을하고 환경 설정이 저장된 후 분리합니다 :
난이 같은 가동 잠금을 설정했습니다. 그러나 이것은 아무 것도 변경하지 않습니다.
그냥 여기에 내가 사용자가 전화를 잠금 현재 배터리 잔량을 절약 할 수있는 방법, 내 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이 변경되지 않는 이유는 무엇입니까?
감사합니다.