WAKE_LOCK不起作用

时间:2015-07-29 15:47:53

标签: android broadcastreceiver android-service wakelock android-wake-lock

我正在开发一个应用程序,该应用程序可以打开某些音乐的链接,这些音乐将通过应用程序自动播放。屏幕未锁定时,此功能正常!但是,这在屏幕锁定和休眠时不起作用(它应该通过闹钟激活,音乐应用程序通常在手机休眠时播放音乐没有任何问题)。所以我导入了PowerManager:

   import android.os.PowerManager;

在我的公开课中,我有:

   private PowerManager.WakeLock mWakeLog;

这段代码:

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

然后该链接应该打开并且稍后:

   mWakeLog.release();

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

现在这很有趣:如果屏幕被锁定但是已经醒来,音乐会播放!

原因我添加了权限:

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

我还尝试过其他一些标志,例如“FULL_WAKE_LOCK”等,我也试过这个。警报正在调用这个类,并在它上面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尝试这一切,但接下来会出现问题:我的接收器无法启动。所以这里是警报获取startet时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中,我正在调用广播

    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);
        }
    }

不幸的是,它没有记录“收到”: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 android:name=".MyIntentService" android:enabled="true"></service>
      <receiver android:name=".MyWakefulReceiver"></receiver>

3 个答案:

答案 0 :(得分:1)

似乎您的wakeLock是活动的一部分,但是当屏幕被锁定时,您的活动会进入暂停模式(至少)。

您需要使用Service播放收音机/音乐,然后将其唤醒以保持设备处于唤醒状态以继续播放。

答案 1 :(得分:0)

  

我正在开发一个应该打开某些音乐链接的应用程序   这将通过应用程序自动播放。

听起来你正确地获得了WakeLock

但是你试图在另一个没有唤醒锁的应用中打开音乐。

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

请注意,还有其他(可能更好)的方法可以实现您的目标:

使用Activity 保持屏幕开启:

使用BroadcastReceiver 从睡眠状态唤醒设备:

警报类型应用程序通常还需要通过锁定屏幕显示其活动。即,当手机被锁定时,您可能还想向用户显示您的活动。

这似乎超出了这个问题的范围,但在这篇相关文章中有很多信息:

答案 2 :(得分:0)

好吧,我想,我解决了这个问题。 似乎主要的问题是WakeLock在唤醒我的手机时没有显示任何活动。我创建了一个活动来显示,但是打开的链接在某种程度上没有重点关注我的活动。但是我甚至不想在第一时间开展这样的活动,所以我写了一个onPause()方法来finish活动。谢谢你的帮助:P