ユーザーが電源ボタンを押したときに現在のバッテリー レベルを保存しようとしています (--> 画面オフ)。
最初は、電話が起動するたびに起動するブロードキャストレシーバーを使用しています。タスクは、サービスを開始することです。これにより、画面のオフ/オンのインテント用に別のブロードキャスト レシーバーが作成されます (マニフェストで指定されている場合、画面のオフのインテントは機能しないため、このサービスを介して動的に作成しています)。
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);
}
そして、これがScreenReceiverです
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("Saved Preferences", "saved "+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");
}
}
}
では、ユーザーが電話をロックしたときに現在のバッテリー レベルを保存するにはどうすればよいでしょうか。スクリーン オフ インテントの後、サービスが開始されないのはなぜですか? ウェイクロックで何も変わらないのはなぜですか?
ありがとう!