Android 当应用程序提示用户时唤醒设备
我使用handler每5分钟重复提示用户输入一次。当设备进入睡眠模式且屏幕被锁定时,当我的应用程序提示用户输入时,如何唤醒设备?我试过这个,但似乎不起作用。我在清单中添加了Android 当应用程序提示用户时唤醒设备,android,wakelock,wakeup,Android,Wakelock,Wakeup,我使用handler每5分钟重复提示用户输入一次。当设备进入睡眠模式且屏幕被锁定时,当我的应用程序提示用户输入时,如何唤醒设备?我试过这个,但似乎不起作用。我在清单中添加了WAKE\u LOCK权限 class BtHandler extends Handler { private PowerManager pm; private WakeLock wl; @Override public void handleMessage(Message msg) {
WAKE\u LOCK
权限
class BtHandler extends Handler {
private PowerManager pm;
private WakeLock wl;
@Override
public void handleMessage(Message msg) {
pm = (PowerManager)FixedNode.this.getSystemService(Context.POWER_SERVICE);
if (!pm.isScreenOn()) {
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "TAG");
wl.acquire();
}
FixedNode.this.setAlwaysDiscoverable();
wl.release();
}
}
有什么想法吗
编辑:使用AlarmManager
广播自定义意图
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(300);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
WakeLock wl = null;
if (!pm.isScreenOn()) {
KeyguardLock kl = km.newKeyguardLock("TAG");
kl.disableKeyguard();
wl = pm.newWakeLock(
PowerManager.SCREEN_BRIGHT_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
wl.acquire();
}
Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();
wl.release();
}
};
mFilter = new IntentFilter(ACTION_NAME);
Intent mIntent = new Intent(ACTION_NAME);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, mIntent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (120 * 1000), pendingIntent);
Toast.makeText(this, "Alarm set", Toast.LENGTH_LONG).show();
通常情况下,
wakelock
不会在屏幕上实际打开。所以你应该用它来锁定尾迹
获取导致唤醒
作为附加标志 查看AlarmManager类 有点像“cron” 好的,下面是一段工作代码-首先是activity类:
import android.app.Activity;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
public class MainActivity extends Activity {
private WakeLock wl;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//acquire wake lock
PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP|PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "TAG");
wl.acquire();
// schedule alarm
Intent i = new Intent();
i.setAction(WakeReciever.WAKE_INTENT);
PendingIntent pIntent = PendingIntent.getBroadcast(this, 0, i, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 120000,
pIntent);
}
@Override
protected void onPause() {
wl.release();
super.onPause();
}
}
接下来是广播接收机:
package com.test;
import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.Context;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
public class WakeReciever extends BroadcastReceiver {
public static final String WAKE_INTENT = "com.test.WAKE";
/**
* @see android.content.BroadcastReceiver#onReceive(Context,Intent)
*/
@Override
public void onReceive(Context context, Intent intent) {
//acquire wake lock
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
wl.acquire();
//start activity
Intent i = new Intent();
i.setClassName("com.test", "com.test.MainActivity");
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
wl.release();
}
}
最后,不要忘记清单文件:
<?xml version="1.0" encoding="UTF-8"?>
<manifest android:versionCode="1" android:versionName="1.0"
package="com.test" xmlns:android="http://schemas.android.com/apk/res/android">
<uses-sdk android:minSdkVersion="8"/>
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:label="@string/app_name" android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name=".WakeReciever" android:enabled="true">
<intent-filter>
<action android:name="com.test.WAKE"></action>
</intent-filter>
</receiver>
</application>
</manifest>
据我所见,您在获得唤醒锁后立即将其释放。这就是为什么它给人的印象是不起作用。移除它并将其放置在获取它的方法之外的其他地方
mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
v.vibrate(300);
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
WakeLock wl = null;
if (!pm.isScreenOn()) {
KeyguardLock kl = km.newKeyguardLock("TAG");
kl.disableKeyguard();
wl = pm.newWakeLock(
PowerManager.SCREEN_BRIGHT_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP, "TAG");
wl.acquire();
}
Toast.makeText(context, "Alarm worked", Toast.LENGTH_LONG).show();
}
};
我认为不可能用应用程序绕过屏幕锁定。在这种情况下,你有什么建议?有没有办法让用户知道他们需要提供输入?你必须无限期地打开屏幕。当然,那将是chew扔掉电池的结果。这是一种享受。我没有打开屏幕锁。我几乎放弃了,但后来偶然发现了你的帖子。我遇到的问题是,我使用的是ACQUIRE_CASE_WAKEUP,而不是Aniket建议的两者。我投了你们两个的票。你的意思是用
ACQUIRE\u CAUSES\u WAKEUP
替换FULL\u WAKE\u LOCK
?它不起作用。当我唤醒设备时,我的应用程序奇怪地退出了。我错过什么了吗?没有,没有。添加像FULL_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUPAh这样的标志,只需阅读与此相关的几个线程。但它仍然不起作用。但我会读其他的线索,并尝试一下。谢谢PS:当我开始工作时,我会接受答案;)目前它还不能完全工作,但至少它会在屏幕上闪烁一下。你是个天才。我为此挣扎了几个小时。我只使用了ACQUIRE_CAUSES_WAKEUP而不是两者。干杯:-)当设备进入睡眠模式时,我的闹钟不响。您有什么具体的报警方法吗?我建议您使用AlarmManager来生成预定意图,并使用BroadcastReceiver来获取唤醒锁并启动应用程序。这种方法比使用handler节省电池寿命多得多。顺便说一句-在您的代码中我看到了尝试唤醒手机-您是否设置了唤醒锁以保持手机处于活动状态?否则,当手机处于睡眠模式时,您的应用程序甚至不会运行此代码。是的,我也尝试过此代码,但它没有任何作用。正如我所说,当设备休眠时,报警器不会触发。请看编辑后的帖子。我附上密码,为我做了一件好事。我让alarm manager无论如何都在工作,但无法使用ACQUITE_CAUSE_WAKEUP唤醒设备。我几乎放弃了,然后看到你们的例子和OR。工作请客谢谢:-)