屏幕锁定,但仍然执行工作并听取ACTION_MEDIA_BUTTON

时间:2018-01-10 22:40:37

标签: android broadcastreceiver

我有一个mainActivity可以通过BroadcastReciever类检测来自我耳机的点击,但只有当我的应用程序在前台时才能检测到。我想在我的应用程序处于后台时能够做同样的事情,或者在我的屏幕被锁定时更具体。现在,当屏幕锁定时,单击耳机上的按钮会打开spotify。

在我的onCreate和等效的onDestroy中,我尝试使用:

    powerMngr = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
    wakeLock = powerMngr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock");
    wakeLock.acquire();

然而,这不符合我的要求。我需要采取哪些步骤来实现这一目标?需要什么课程?如何在屏幕锁定时执行工作?

编辑:经过进一步的研究后,我至少知道为什么Spotify会在我点击耳机按钮时启动。这是最后一次运行 MediaSession。如果我正确解释它,似乎我的应用程序需要有最新的MediaSession和mediaButtonReciever。仍然不确定如何实现这个: https://developer.android.com/guide/topics/media-apps/mediabuttons.html

这是我目前用于捕获耳机点击的服务:

public class HeadsetActionButtonReceiver extends BroadcastReceiver {

public static Delegate delegate;

private static AudioManager mAudioManager;
private static ComponentName mRemoteControlResponder;

private static int doublePressSpeed = 300; // double keypressed in ms
private static Timer doublePressTimer;
private static int counter;

public interface Delegate {
    void onMediaButtonSingleClick();
    void onMediaButtonDoubleClick();
}

@Override
public void onReceive(Context context, Intent intent) {
    if (intent == null || delegate == null || !Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction()))
        return;

    KeyEvent keyEvent = (KeyEvent) intent.getExtras().get(Intent.EXTRA_KEY_EVENT);
    if (keyEvent == null || keyEvent.getAction() != KeyEvent.ACTION_DOWN) return;

    counter++;
    if (doublePressTimer != null) {
        doublePressTimer.cancel();
    }
    doublePressTimer = new Timer();
    doublePressTimer.schedule(new TimerTask() {

        @Override
        public void run() {
            if (counter == 1) {
                delegate.onMediaButtonSingleClick();
            } else {
                delegate.onMediaButtonDoubleClick();
            }
            counter = 0;
        }
    }, doublePressSpeed);
}

public static void register(final Context context) {
    mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
    mRemoteControlResponder = new ComponentName(context, HeadsetActionButtonReceiver.class);
    mAudioManager.registerMediaButtonEventReceiver(mRemoteControlResponder);
}

public static void unregister(final Context context) {
    mAudioManager.unregisterMediaButtonEventReceiver(mRemoteControlResponder);
    if (doublePressTimer != null) {
        doublePressTimer.cancel();
        doublePressTimer = null;
    }
}

}

1 个答案:

答案 0 :(得分:0)

我设法让这个工作。要捕获耳机按钮点击甚至蓝牙按钮点击,您需要MediaSession。您还需要定义MediaSessionCompat。设置MediaSession.setActive(true)的位置,这是必须的,以便在后台捕获点击次数。此外,在覆盖MediaSessionCompat.Callback()

的位置创建onMediaButtonEvent

关注googles开发人员指南,了解我在此处撰写的所有内容以获取更多信息,您应该能够完成此任务。此外,服务通常在后台运行,并且只要它们不被破坏就能够执行工作。