听取ACTION_SCREEN_OFF

Pet*_*ter 18 android

我正在尝试启动一个在正在侦听的后台运行的服务,ACTION_SCREEN_OFF当它找到时ACTION_SCREEN_OFF,启动我的活动.

我读到了你需要创建一个BroadcastReceiver的地方,因为把它放在清单XML中是行不通的.但是我不知道经过多次搜索后从哪里开始.

Dra*_*ork 41

你不能声明ACTION_SCREEN_ON,并ACTION_SCREEN_OFFAndroidManifest.xml中.您只能在活动运行时捕获它们.

这是一个例子.

广播接收器:

public class ScreenReceiver extends BroadcastReceiver {

    public static boolean wasScreenOn = true;

    @Override
    public void onReceive(final Context context, final Intent intent) {
        if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) {
            // do whatever you need to do here
            wasScreenOn = false;
        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
            // and do whatever you need to do here
            wasScreenOn = true;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

活动:

public class ExampleActivity extends Activity {

    private BroadcastReceiver mReceiver = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // initialize receiver
        final IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        mReceiver = new ScreenReceiver();
        registerReceiver(mReceiver, filter);
        // your code
    }

    @Override
    protected void onPause() {
        // when the screen is about to turn off
        if (ScreenReceiver.wasScreenOn) {
            // this is the case when onPause() is called by the system due to a screen state change
            Log.e("MYAPP", "SCREEN TURNED OFF");
        } else {
            // this is when onPause() is called when the screen state has not changed
        }
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        // only when screen turns on
        if (!ScreenReceiver.wasScreenOn) {
            // this is when onResume() is called due to a screen state change
            Log.e("MYAPP", "SCREEN TURNED ON");
        } else {
            // this is when onResume() is called when the screen state has not changed
        }
    }

    @Override
    protected void onDestroy() {
        if (mReceiver != null) {
            unregisterReceiver(mReceiver);
            mReceiver = null;
        }
        super.onDestroy();
    }

}
Run Code Online (Sandbox Code Playgroud)

你可以通过听一下这些事件来解决你的问题Service.

  • 这里的问题是在`BroadcastReceiver.onReceive()`之前调用了活动的`onResume()`和`onPause()`. (3认同)
  • 顺便说一句,上面的代码来自以下文章http://thinkandroid.wordpress.com/2010/01/24/handling-screen-off-and-screen-on-intents/ (3认同)