Android Включите экран и начните действие, когда он выключен

Я делаю приложение для будильника, и я нахожусь на этапе, когда мне нужно отобразить экран будильника (AlarmActivity), поскольку вызывается onReceive from BroadcastReceiver. Вот то, чего мне нужно достичь, когда придет время бить тревогу.

  1. Когда экран выключен, включите устройство и отобразите экран будильника, когда придет время.
  2. Когда экран включен, но приложение выключено, отобразите экран будильника.
  3. Когда экран включен и пользователь находится в приложении будильника, отобразите экран будильника.

Я пробовал этот код, но он не работает. Начать активность, даже если экран выключен

onCreate моей основной деятельности..

        setContentView(R.layout.activity_main);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        Intent myIntent1 = new Intent(this, AlarmReceiver.class);
        myIntent1.putExtra("msg", "Wake up Wake up1");
        myIntent1.putExtra("repeat", 0);
        PendingIntent pendingIntent1 = PendingIntent.getBroadcast(this, 2571123, myIntent1, PendingIntent.FLAG_UPDATE_CURRENT);

        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY, 19);
        calendar.set(Calendar.MINUTE, 48);
        calendar.set(Calendar.SECOND, 00);

        alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent1);

Он устанавливает будильник на определенное время.

Это мой класс AlarmReceiver.

    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public void onReceive(Context context, Intent intent) {
        String msg = intent.getStringExtra("msg");
        Log.d("ALARMONMATE",msg);

        Intent intent1 = new Intent(context, SampleAlarmActivity.class);
        intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent1.putExtra("msg",msg);
        context.startActivity(intent1);

Вот мой AlarmActivity.java, экран, который я хочу отображать при вызове будильника.

public class SampleAlarmActivity extends AppCompatActivity {
    private PowerManager.WakeLock wake = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sample_alarm);

        Intent intent = getIntent();
        String msg = intent.getStringExtra("msg");
        TextView txt = findViewById(R.id.textView);
        txt.setText(msg);






        PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
        wake = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "App:wakeuptag");
        wake.acquire(1*60*1000);


        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
            setShowWhenLocked(true);
            setTurnScreenOn(true);
        } else {
            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);
        }
    }
}


Если бы кто-нибудь мог хотя бы оставить ссылку, на которую я могу сослаться, или концепции, которые были бы полезны в этом случае, это было бы здорово. Я изучил WakeLock и получил более 20 вопросов по этой проблеме. Однако я не был слишком уверен, устарели они или нет, поскольку большинство из них были созданы более 8 лет назад.


person HeyMate    schedule 25.01.2021    source источник
comment
Вы не можете запускать действия в фоновом режиме в последних версиях Android. Вы должны иметь возможность использовать высокоприоритетный Notification с полноэкранным Intent.   -  person CommonsWare    schedule 25.01.2021
comment
Вы не используете Notification. Уведомление PendingIntent относится к PendingIntent, вызванному взаимодействием пользователя с Notification.   -  person CommonsWare    schedule 25.01.2021
comment
@CommonsWare Это имеет смысл, спасибо. Это оставляет вопрос, хотя. Как приложения будильника отображают полноэкранный режим, когда будильник срабатывает с таким количеством ограничений?   -  person HeyMate    schedule 25.01.2021
comment
Насколько я знаю, они используют высокоприоритетный Notification с полноэкранным Intent. Когда экран моего устройства включен, я получаю всплывающее окно о будильнике. Когда экран моего устройства выключен, я получаю информацию об активности, обозначенной полноэкранным Intent.   -  person CommonsWare    schedule 25.01.2021
comment
@CommonsWare Большое спасибо за то, что не пожалели вашего времени. Я рассмотрю это как можно скорее.   -  person HeyMate    schedule 25.01.2021