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
保持屏幕开启:
- 考虑使用
FLAG_KEEP_SCREEN_ON
标志
- 如果您的应用在前台,这是推荐的方法
使用 BroadcastReceiver
将设备从睡眠中唤醒:
- 阅读
WakefulBroadcastReceiver
- 允许您接收
Intent
并继续在后台工作
闹钟类应用通常也需要在锁定屏幕上显示它们的活动。即当 phone 被锁定时,您可能想要向用户显示您的 activity。
这似乎超出了这个问题的范围,但是这个相关的 post:
有很多信息
- Android Galaxy S4 -- Activity that is visible over lock screen
好的,我想我解决了这个问题。
看来主要问题是 WakeLock
在唤醒我的 phone 时无法显示 activity。我创建了一个 activity 来显示,但是以某种方式打开的 link 使我的 activity 失去了焦点。但是我一开始甚至不想有这样一个 activity,所以我写了一个 onPause()
方法,它将 finish
activity。感谢您的帮助:P
我正在开发一个应用程序,它可以打开 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
保持屏幕开启:
- 考虑使用
FLAG_KEEP_SCREEN_ON
标志 - 如果您的应用在前台,这是推荐的方法
使用 BroadcastReceiver
将设备从睡眠中唤醒:
- 阅读
WakefulBroadcastReceiver
- 允许您接收
Intent
并继续在后台工作
闹钟类应用通常也需要在锁定屏幕上显示它们的活动。即当 phone 被锁定时,您可能想要向用户显示您的 activity。
这似乎超出了这个问题的范围,但是这个相关的 post:
有很多信息- Android Galaxy S4 -- Activity that is visible over lock screen
好的,我想我解决了这个问题。
看来主要问题是 WakeLock
在唤醒我的 phone 时无法显示 activity。我创建了一个 activity 来显示,但是以某种方式打开的 link 使我的 activity 失去了焦点。但是我一开始甚至不想有这样一个 activity,所以我写了一个 onPause()
方法,它将 finish
activity。感谢您的帮助:P