Я кодирую приложение тревоги. Когда пришло время звонить, я хочу, чтобы устройство проснулось и показало мою активность, которая позволяет пользователю отключить будильник. Работает нормально, за исключением случаев, когда устройство заблокировано (иначе на экране блокировки).
Я перепробовал многие ответы, которые нашел по этому поводу, но почти все кажется устаревшим, и я, очевидно, хочу избегать использования этих методов. С текущим кодом, который у меня есть (где я пытался объединить найденные ответы), он будет вибрировать в течение очень короткого времени (что должен делать мой будильник, когда он звонит, но обычно он продолжается до тех пор, пока будильник не отключен) , но не более. При последующем разблокировании устройства действие по отключению будильника не отображается, и будильник не звонит (что делается этим занятием). Однако я проверил и убедился, что метод onCreate () выполняется полностью и без ошибок до конца.
В моем BroadcastReceiver (я использую AlarmManager для выполнения своего кода в нужное время):
@Override
public void onReceive(Context context, Intent intent)
{
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "myalarmapp:alarm.");
wl.acquire(600000);
Intent startAlarmActivity = new Intent(context, AlarmActivity.class);
context.startActivity(startAlarmActivity);
wl.release();
}
В методе onCreate () моей деятельности:
setContentView(R.layout.activity_alarm);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(true);
setTurnScreenOn(true);
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
keyguardManager.requestDismissKeyguard(this, null);
}
else {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
В моем AndroidManifest.xml:
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
...
<activity
android:name=".view.AlarmActivity"
android:excludeFromRecents="true"
android:showOnLockScreen="true"
android:showWhenLocked="true"
android:turnScreenOn="true"
android:showForAllUsers="true">
</activity>
Желательно, чтобы действие показывалось «над» экраном блокировки, но это не мой главный приоритет. Было бы достаточно, если бы действие началось, и пользователь должен был разблокировать свой телефон, чтобы увидеть его, все это время, пока оно вибрирует и звонит по телефону.
Примечание: я тестирую свое приложение на Android 7.1, и мой текущий минимальный уровень API равен 21.