10

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

有没有人有任何例子?

谢谢。

4

3 回答 3

8

为了让 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);

这将唤醒您的应用活动。

于 2014-04-14T01:26:45.650 回答
4

我刚刚编写了一个可以执行此操作的应用程序,这里有一些示例代码: 首先,我创建一个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(今天或明天)唤醒我的手机。

于 2015-08-13T18:50:31.430 回答
0

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

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

于 2014-04-14T00:40:18.967 回答