当定时器调用 onFinish() 时点亮屏幕

Turn on the screen when timer calls onFinish()

我正在使用 Pomodoro Technique 创建一个计时器。第一个计时器将是 20 分钟,我希望此时屏幕会关闭。我希望屏幕在计时器结束后重新打开。

在我的清单中,我请求了以下权限:

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

在我的计时器中 class 我在 onCreat() 中得到 window:

Window win;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_timer);
    createTimer(time_work);
    win = this.getWindow();
}

在我的计时器的 onFinish() 中调用 wakeUp():

public void onFinish() {
    text_time.setText(R.string.done);
    if (isWork) {
       pomodoro_count++;
       text_pomodoro_count.setText(String.valueOf(pomodoro_count));
       }
    isWork = !isWork;
    onResume();
    //I have more here but removed for brevity
    wakeUp();
    }

在 wakeUp() 中,我已经尝试了以下所有组合:

private void wakeUp() {
    win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
    win.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
    win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
}

Every answer that I have found is 已贬值。

这需要以不同于我所想的方式来完成。

需要做的是需要从警报创建新的activity。

您在 manifest:

中仍需要相同的权限
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />

你需要 receiver:

public class ReceiverAlarm extends BroadcastReceiver {
private AlarmManager alarmMgr;
private PendingIntent alarmIntent;

//This is what will be called when your alarm goes off
@Override
public void onReceive(Context context, Intent intent) {
    Log.d("Logged", "ReceiverAlarm");
    Intent i = new Intent(context, ScreenWake.class);
    context.startActivity(i);
}

//This is a method I made that will set an alarm
public void setAlarm(Context context, int timeToPop) {
    alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(context, ReceiverAlarm.class);
    alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
    long currentTime = SystemClock.elapsedRealtime();
    long timeToAdd = (long) timeToPop;
    alarmMgr.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
            currentTime + timeToAdd, alarmIntent);
}

public void cancelAlarm(Context context) {
    Intent intent = new Intent(context, ReceiverAlarm.class);
    PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.cancel(sender);
}

然后你将需要一个完全不同的activity来打开当通过闹钟调用闹钟时:

ScreenWake.java:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_alarm_wakes_screen);

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

    ms = new ManagerSound(getApplicationContext());
    ms.playAlarm();
}