当定时器调用 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();
}
我正在使用 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();
}