2

我已经实现了一个 Android 服务 ( START_STICKY),它在设备启动时启动并在后台运行。该服务的功能是与 SD 卡交互。由于它连续运行,以粘性启动它会消耗电池。为了解决大量的电池消耗问题,我想在用户使用设备时启动此服务。

理想情况下,基于ACTION_SCREEN_ON&ACTION_SCREEN_OFF意图启动/停止服务。

当我对此进行测试时发现我无法在清单中注册ACTION_SCREEN_OFF& ACTION_SCREEN_ON,因此我在我的服务中创建了一个广播接收器来捕获ACTION_SCREEN_OFF& ACTION_SCREEN_ON

但是,由于我无法在清单中注册意图,所以当我在ACTION_SCREEN_OFF. 当屏幕重新打开时,我怎么可能启动它?

注意:正如我已经提到的SCREEN_ON+SCREEN_OFF不能在清单文件中注册。它像这样注册

// REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC 

IntentFilter filter = new IntentFilter(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
broadcastReceiver = new TestReceiver();
registerReceiver(broadcastReceiver, filter); 

因此,当服务未运行时,此意图将不会触发。

4

2 回答 2

1

您可以使用 BroadCastReciever 根据广播类型调用您的服务

public class MyReceiver extends BroadcastReceiver {

     public static boolean wasScreenOn = true;

    @Override
    public void onReceive(Context context, Intent intent) {

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

            // do whatever you need to do here

        } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
              // and do whatever you need to do here

        }
       else if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED))
        {
          // and do whatever you need to do here
       }

    }
于 2013-10-10T11:36:00.553 回答
0

有一个 ACTION_SCREEN_ON、ACTION_SCREEN_OFF 和 ACTION_USER_PRESENT 的广播接收器。

当触发 ACTION_SCREEN_ON 时,将调用活动的 onResume。创建一个处理程序并等待 ACTION_USER_PRESENT。当它被触发时,实现你想要的活动。

注册接收器如下:

private void registBroadcastReceiver() {
    final IntentFilter theFilter = new IntentFilter();
    /** System Defined Broadcast */
    theFilter.addAction(Intent.ACTION_SCREEN_ON);
    theFilter.addAction(Intent.ACTION_SCREEN_OFF);

    mPowerKeyReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String strAction = intent.getAction();

            if (strAction.equals(Intent.ACTION_SCREEN_OFF) || strAction.equals(Intent.ACTION_SCREEN_ON)) {
                // > Your playground~!
            }
        }
    };

    getApplicationContext().registerReceiver(mPowerKeyReceiver, theFilter);
}
于 2013-10-10T11:38:38.580 回答