2011-06-22 137 views
3

我正在使用处理程序来重复提示用户输入每个输入。 5分钟。当设备进入休眠模式并且屏幕锁定时,如何在我的应用程序提示用户输入时唤醒设备?我试过这个,但它似乎没有工作。我已在清单中添加WAKE_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(); 
+0

我不认为有可能通过应用程序绕过屏幕锁定。 – Haphazard

+0

在这种情况下你有什么建议?有没有办法让用户知道他们需要提供输入? – springrolls

+0

你将不得不无限期地保持屏幕。这当然会咀嚼电池。 – Haphazard

回答

4

通常wakelock犯规实际打开屏幕。所以,你应该用

ACQUIRE_CAUSES_WAKEUP

作为一个额外的标志得到唤醒锁。

+0

你的意思是用'ACQUIRE_CAUSES_WAKEUP'替换'FULL_WAKE_LOCK'?它不起作用。当我将设备唤醒时,我的应用程序奇怪地退出。我在这里错过了什么吗? – springrolls

+0

不能替代。添加该标志,如FULL_WAKE_LOCK | ACQUIRE_CAUSES_WAKEUP –

+0

嗯,只需阅读几条与此相关的线程。但它仍然不起作用。但我会阅读其他线索并试一试。谢谢! PS:当我开始工作时会接受答案;) – springrolls

3

看看为AlarmManager类 http://developer.android.com/reference/android/app/AlarmManager.html 这有点像“cron的”

好吧,这里是一块工作的代码 - 首先来到了活动类:

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> 
+2

当设备进入休眠模式时,我的闹钟不会触发。任何具体的警报方法,你会建议? – springrolls

+0

我建议你使用AlarmManager来生成sheduled意图和BroadcastReciever来获取唤醒锁并启动你的应用程序。这种方法比使用处理器节省更多的电池寿命。顺便说一句 - 在我看到你的代码尝试唤醒电话 - 你设置唤醒锁定保持电话处于活动状态?否则,当手机处于睡眠模式时,您的应用程序甚至不会运行此代码。 – piotrpo

+0

是的,我也试过那个,但它什么也没做。正如我所说,当设备睡眠时闹铃不会闪光。请参阅编辑过的帖子。我附上了代码。 – springrolls

0

从我所看到的,您在获取它后立即释放唤醒锁。这就是为什么它给人的印象是不工作。将它移除并将其放在获取它的方法之外的其他位置。

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(); 
    } 
}; 
相关问题