2013-03-28 9 views
1

사용자가 전원 버튼 (-> 화면 꺼짐)을 누르면 현재 배터리 수준을 저장하려고합니다.잠금 화면이 작동하지 않을 때 현재 배터리 잔량을 저장하십시오.

처음에는 전화가 부팅 될 때마다 시작되는 브로드 캐스트 수신기가 있습니다. 이것은 화면 오프/인 텐트를위한 또 다른 브로드 캐스트 리시버를 만드는 서비스를 시작하는 것입니다 (- 매니 페스트에 화면을 지정하지 않으면 스크린 인 텐트가 작동하지 않으므로이 서비스를 통해 동적으로 생성합니다)

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이 변경되지 않는 이유는 무엇입니까?

감사합니다.

답변

0

OUCH ... 매니페스트에서 ActionService를 선언하는 것을 잊어 버렸습니다. O