【问题标题】:Turn on the screen when timer calls onFinish()定时器调用 onFinish() 时打开屏幕
【发布时间】:2018-04-01 03:13:21
【问题描述】:

我正在使用Pomodoro Technique 创建一个计时器。第一个计时器将是 20 分钟,在这段时间内我希望屏幕会关闭。我希望屏幕在计时器完成后重新打开。

在我的清单中,我要求获得以下权限:

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

在我的计时器类中,我在 onCreat() 中获得了窗口:

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 回答thathave 发现is 折旧。

【问题讨论】:

  • 需要更多信息。这是在屏幕锁定时调用的吗?
  • 我提到你的链接说在哪里调用wakeUp(),但是这个方法可能被弃用了。还有一些其他示例,请尝试一下!
  • 是的,该链接已被弃用一段时间。我明天将对此进行破解。谢谢你的帮助。

标签: android window


【解决方案1】:

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

需要做的是需要从警报中创建一个新活动。

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

然后,当通过警报调用警报时,您将需要打开一个完全不同的活动:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2012-12-05
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多