WAKE_LOCK 行不通

WAKE_LOCK won't work

我正在开发一个应用程序,它可以打开 link 一些音乐,这些音乐将通过应用程序自动播放。当屏幕未锁定时,这可以正常工作!然而,这在屏幕锁定和休眠时不起作用(它应该通过闹钟激活,音乐应用程序通常在 phone 休眠时播放音乐没有任何问题)。所以我导入了 PowerManager:

   import android.os.PowerManager;

在我的 public class 我有:

   private PowerManager.WakeLock mWakeLog;

还有这段代码:

   PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
   mWakeLog = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "stuff");
   mWakeLog.acquire();

然后 link 应该会打开,稍后:

   mWakeLog.release();

我通过日志记录测试,警报实际上正在激活此代码,但音乐不会播放。但是,当我解锁 phone 时它会立即播放音乐,但这不是我想要的。

有趣的是:锁屏唤醒时会播放音乐!

因为我添加了权限:

   <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

我还尝试了一些其他标志,如 "FULL_WAKE_LOCK" 等,我也尝试过这个。警报正在调用此 class 并且在它的 onCreate 中我得到了这个:

   getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
   //some code
   getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

   v.setKeepScreenOn(true);

所以看起来主要问题可能是唤醒锁没有打开屏幕 "FULL_WAKE_LOCK"。


更新#2.1

根据 Richard Le Mesurier 和 galex 以及其他网站的建议,我现在正在尝试使用 WakefulBroadcastReceiver 进行所有操作,但是下一个问题来了:我的接收器无法启动.所以这是闹钟启动时 MainActivity 中的代码:

    Intent intent = new Intent(MainActivity.this, AlarmReceiverActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10000,   pendingIntent);

并且在我的 AlarmReceiverActivity onCreate 中调用 Broadcast

    Intent intent = new Intent(AlarmReceiverActivity.this, MyWakefulReceiver.class);
    sendBroadcast(intent);

在 MyWakefulReceiver 中我得到了这个:

    public class MyWakefulReceiver extends WakefulBroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(MyWakefulReceiver.class.getSimpleName(), "received");
            Intent service = new Intent(context, MyIntentService.class);
            startWakefulService(context, service);
        }
    }

不幸的是它没有记录 "received" :c

现在这是我的服务:

       public class MyIntentService extends IntentService {
           public MyIntentService() { super("MyIntentService"); }
           @Override
           protected void onHandleIntent(Intent intent) {

               //bla code
               Log.d(MyIntentService.class.getSimpleName(), "service");

               MyWakefulReceiver.completeWakefulIntent(intent);
           }
       }

而且它没有记录 "service"

当然我已经更新了我的清单:

      <service android:name=".MyIntentService" android:enabled="true"></service>
      <receiver android:name=".MyWakefulReceiver"></receiver>

您的 wakeLock 似乎是 activity 的一部分,但您的 activity 在屏幕锁定时进入暂停模式(至少)。

您需要使用 Service 让您的 radio/music 播放,然后唤醒锁定它以保持设备唤醒以继续播放。

I'm working on an App which is supposed to open a link to some music which will be played automatically through an app.

听起来你 WakeLock 是正确的。

但是您正尝试在没有唤醒锁的其他应用中打开音乐。

您的唤醒锁仅适用于您的应用,不适用于其他应用。您无法控制其他应用程序。


请注意,还有其他(可能更好的)方法可以完成您想要的:

使用 Activity 保持屏幕开启:

使用 BroadcastReceiver 将设备从睡眠中唤醒:


闹钟类应用通常也需要在锁定屏幕上显示它们的活动。即当 phone 被锁定时,您可能想要向用户显示您的 activity。

这似乎超出了这个问题的范围,但是这个相关的 post:

有很多信息
  • Android Galaxy S4 -- Activity that is visible over lock screen

好的,我想我解决了这个问题。 看来主要问题是 WakeLock 在唤醒我的 phone 时无法显示 activity。我创建了一个 activity 来显示,但是以某种方式打开的 link 使我的 activity 失去了焦点。但是我一开始甚至不想有这样一个 activity,所以我写了一个 onPause() 方法,它将 finish activity。感谢您的帮助:P