如何从睡眠中唤醒安卓手机?

Posted

技术标签:

【中文标题】如何从睡眠中唤醒安卓手机?【英文标题】:how to wakeup android phone from sleep? 【发布时间】:2014-05-27 19:50:44 【问题描述】:

如何以可编程的方式将安卓手机从睡眠中唤醒(挂起到内存)?我不想获得任何唤醒锁,这意味着手机在禁用 cpu 的情况下进入“真正的”睡眠状态。我想我可以使用某种 RTC(实时时钟)机制?

有人有例子吗?

谢谢。

【问题讨论】:

您希望它何时唤醒?在一定的超时之后?在某个日期和时间? 您找到解决方案了吗?你觉得任何答案有用吗? 如果您找到问题的答案,请接受下面的答案,或修改您的问题,以便我可以为您提供更多帮助。 【参考方案1】:

为了让 Activity 唤醒设备并且不需要密码/滑动,您只需要添加几个标志。为此,请在您的代码中包含:

this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN |
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
    WindowManager.LayoutParams.FLAG_FULLSCREEN |
    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

这将wake up您的应用活动。

【讨论】:

【参考方案2】:

我刚刚写了一个可以做到这一点的应用程序,下面是一些示例代码: 首先,我创建一个AlarmManager 并设置一个特定时间的闹钟:

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 30);
calendar.set(Calendar.SECOND, 0);
// if the time is before now then add one day to it
if(calendar.getTimeInMillis() < System.currentTimeMillis())
   calendar.setTimeInMillis(calendar.getTimeInMillis()+86400000);
manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 0);

我需要BroadcastReciever 才能收到此警报。为此,我必须将其放入清单中:

<application ...>
    <receiver android:name="hu.bendaf.example.AlarmReceiver"/>
...
</application>

我还有 AlarmReciever 类,它在接收时启动我的主要活动:

public class AlarmReceiver extends BroadcastReceiver 
    public static final String WAKE = "Wake up";
    @Override
    public void onReceive(Context context, Intent intent) 
        //Starting MainActivity
        Intent myAct = new Intent(context, MainActivity.class);
        myAct.putExtra(WAKE, true);
        myAct.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(myAct);
    

在我的 Activity 的 onCreate 函数中,我有:

// Wake up phone if needed
if(getIntent().hasExtra(AlarmReceiver.WAKE) && getIntent().getExtras().getBoolean(AlarmReceiver.WAKE))
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
                        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

此代码会在下一个 15:30:00(今天或明天)唤醒我的手机。

【讨论】:

闹钟是仅从待机模式唤醒,还是从挂起模式唤醒? 正如这个答案所说***.com/a/5120225/3162918,它也可以保证在睡眠模式下工作。我的测试也证实了这一点,警报在任何情况下都会唤醒我的手机应用程序,除了它被关闭。【参考方案3】:

在你想做一些事情的时候使用 AlarmManager 广播一个 Intent 工作并唤醒设备。在广播接收器中,要么做 你需要做的工作(如果它很短),或者获得一个唤醒锁(可能 通过单例),启动服务,让服务完成工作,然后 让服务释放 WakeLock。

你可以在这里阅读:https://groups.google.com/forum/#!topic/android-developers/5--QRAPlFL0

【讨论】:

hmmm...,我尝试了 AlarmManager,如果手机处于“真实”睡眠状态(无唤醒锁),它似乎不会唤醒手机。 手机处于休眠状态时如何唤醒手机。 @jiawen AlarmManager 将使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle() 而不是 set()。即使设备处于睡眠状态,以这种方式设置的警报也会被广播。 闹钟是仅从待机模式唤醒,还是从挂起模式唤醒?

以上是关于如何从睡眠中唤醒安卓手机?的主要内容,如果未能解决你的问题,请参考以下文章

如何修改源码android 实现按键唤醒屏幕

安卓 C2DM 睡眠手机

安卓笔记20170118

wake up on lan 安卓手机控制局域网唤醒开机+远程关机

安卓手机怎么设置双击亮屏教程

官方回复在安卓iOS中从app内通过androidamap://等协议唤醒手机上的高德地图app进行导航,高德平台会收费吗?高德地图URI API调用(安卓ios端)是否免费 - 商用5W一年