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);
    }

そして、これが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");
        }
    }

}

では、ユーザーが電話をロックしたときに現在のバッテリー レベルを保存するにはどうすればよいでしょうか。スクリーン オフ インテントの後、サービスが開始されないのはなぜですか? ウェイクロックで何も変わらないのはなぜですか?

ありがとう!

4

1 に答える 1

0

痛い...マニフェストでActionServiceを宣言するのを忘れました:O

于 2013-03-28T10:17:48.007 に答える