ACTION_SCREEN_ON и ACTION_SCREEN_OFF не работают? - PullRequest
7 голосов
/ 09 сентября 2011

Я пытаюсь выключить WiFi, когда экран выключен (заблокирован), и снова включить его, когда экран включен (разблокирован).

Я сделал BroadcastReceiver; введите в манифест этот код:

<receiver android:name="MyIntentReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.SCREEN_OFF" />
                <action android:name="android.intent.action.SCREEN_ON" />
                <action android:name="android.intent.action.USER_PRESENT" />
                <category android:name="android.intent.category.HOME" />
                <category android:name="android.intent.category.LAUNCHER" />    
            </intent-filter>
        </receiver>

а это класс MyIntentReceiver:

package org.androidpeople.boot;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyIntentReceiver extends BroadcastReceiver {
    // Called when boot completes

    public static boolean startup;

    @Override
    public void onReceive(Context context, Intent intent) {
        // Set what activity should launch after boot completes

        System.out.println("Intent Action: " + intent.getAction());

        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {

            System.out.println("locked : ACTION_SCREEN_OFF");

        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {

            System.out.println("not locked : ACTION_SCREEN_ON ");

        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {

            System.out.println("User Unlocking it ");

        } 
        else if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
            // this to indicate that program is running
            // automaticlly not manually by user
            startup = true;
            System.out.println("Automatic BOOT at StartUp");

            Intent startupBootIntent = new Intent(context, LaunchActivity.class);
            startupBootIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(startupBootIntent);
        }

    }
}

И результат - оба ACTION_SCREEN_ON и ACTION_SCREEN_OFF никогда не стреляли! USER_PRESENT и BOOT_COMPLETED работали нормально, а другие - нет. Я использую эмулятор, а не реальное устройство - может ли это вызвать проблему?

Любая помощь? Мне нужно ловить экран включением и выключением, чтобы включить / отключить WiFi для экономии заряда батареи.

Заранее спасибо

Ответы [ 2 ]

13 голосов
/ 30 ноября 2011

Чтобы захватить действия SCREEN_OFF и SCREEN_ON (и, возможно, другие), вы должны сконфигурировать BroadcastReceiver по коду, а не через манифест.

IntentFilter intentFilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
BroadcastReceiver mReceiver = new ScreenStateBroadcastReceiver();
registerReceiver(mReceiver, intentFilter);

Это проверено и работает правильно.

8 голосов
/ 09 сентября 2011

Вы не можете поймать эти намерения через XML (я забыл почему).Тем не менее, вы можете использовать Service, который регистрирует член BroadcastReceiver в его onStartCommand() и отменяет его регистрацию в его onDestroy().Это потребует, чтобы служба работала в фоновом режиме, постоянно или так долго, как вам нужно, поэтому обязательно изучите альтернативные маршруты.

Вы можете определить BroadcastReceiver в своем классе Service какИтак:

private final class ScreenReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(final Context context, final Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
             //stuff
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
             //other stuff
        }
    }
}

Для немного более сложного примера, но тот, который показывает, как взаимодействуют BroadcastReceiver и Service, см. CheckForScreenBugAccelerometerService из моего приложения ElectricSleep.

...