如何通过AlarmManager唤醒屏幕?

时间:2015-07-15 19:39:10

标签: android alarmmanager wakelock

我试图编码闹钟(这是我的第一个应用)。我确定它很简单,但我被卡住了。我在TimePickerDialog中设置的确切时间内调用活动。我使用getActivity(),所以我不使用BroadcastReceiver。不排除我选择不好,但不幸的是,它只是我找到的那个。

什么时候到来' MainActivity.class'打开,但如果屏幕被锁定,则会发生,但屏幕保持关闭状态。我尝试使用WAKE_LOCK,但我想我是以错误的方式做到的,因为我在POWER_MANAGER行中遇到了错误。

private void setAlarm(Calendar targetCal){

    Intent intent = new Intent(this, MainActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    ((AlarmManager) getSystemService(ALARM_SERVICE)).set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
}
  1. 如何在准确的时间内开启我的屏幕?
  2. 如果可能getActivityBroadcastService,我该怎么做?
  3. 我刚刚开始学习编程,所以如果你能给我一些链接或一个广泛的答案,我将非常感激。

2 个答案:

答案 0 :(得分:1)

试试这些:

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

并在清单中添加此权限:

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

答案 1 :(得分:1)

首先在清单中提供权限

SCNTransaction

然后创建以下课程以唤醒您的手机;

        SCNTransaction.begin()
        SCNTransaction.animationDuration = (0.5)
        SCNTransaction.animationTimingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        SCNTransaction.completionBlock =  {
            SCNTransaction.begin()
            SCNTransaction.animationDuration = (0.5)
            self.scnScene.physicsWorld.speed = 1
            NSLog("animate finished")
            SCNTransaction.commit()
        }
        NSLog("animating")
        self.scnScene.physicsWorld.speed = 0.2
        node.removeFromParentNode()
        SCNTransaction.commit()

在Alarm Reciever类的开头添加此代码行(在OnRecieve方法内);

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

OnRecieve方法结束时的代码行

public class WakeLocker {

 private static PowerManager.WakeLock wakeLock;

 public static void acquire(Context ctx){
     if(wakeLock!=null)wakeLock.release();

     PowerManager pm=(PowerManager)ctx.getSystemService(Context.POWER_SERVICE);
    wakeLock=pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|
            PowerManager.ACQUIRE_CAUSES_WAKEUP|
            PowerManager.ON_AFTER_RELEASE,"tag");
     wakeLock.acquire();
 }

 public static void release(){
     if(wakeLock!=null)
         wakeLock.release();
     wakeLock=null;
 }

}

另外我认为最好为Alarm Manager而不是set()方法调用setExact()方法。因为set()方法在给定的分钟内触发。不完全是在分钟的开始。我更喜欢setExact()方法而不是set()方法。

相关问题