Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to wakeup android phone from sleep?

How to wakeup android phone from sleep (suspend to mem) programmably? I don't want to acquire any wakelock, which means the phone goes into "real" sleep with the cpu disabled. I guess I can use some kind of RTC (real time clock) mechanism?

Does anyone have any examples?

Thanks.

like image 674
jiawen Avatar asked Apr 14 '14 00:04

jiawen


2 Answers

In order to let the Activity wake up the device and not require a password/swipe, you only need to add a few flags. To get that, include to your code:

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);

This will wake up your App activity.

like image 137
Sophia Taylor Avatar answered Oct 03 '22 17:10

Sophia Taylor


I just wrote an application which can do this, here is some example code: First, I create an AlarmManager and set an alarm for a specific time:

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);

I need a BroadcastReciever to recieve this alarm. For this I have to put into my manifest:

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

and I also have the AlarmReciever class, which starts my main Activity on recieve:

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);
    }
}

and in my Activity's onCreate function I have:

// 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);
}

This code wakes up my phone at next 15:30:00 (either it is today or tomorrow).

like image 40
bendaf Avatar answered Oct 03 '22 18:10

bendaf