Активность начинается, но не видна, когда экран выключен или заблокирован - PullRequest
3 голосов
/ 02 октября 2019

Я создаю приложение для напоминания, почти все работает, кроме активности, которая запускается при выключении будильника, не отображается при выключенном экране (телефон находится в спящем режиме). Когда экран включен, виден основной рабочий стол Android и гаснет будильник, активность выглядит отлично.

Я использую AlarmManager.setExactAndAllowWhileIdle (RTC_WAKEUP, ...), чтобы установить будильник, который вызывается приопределенное время.

Вот как я получаю намерение от AlarmManager:

@Override
public void onReceive(Context context, Intent intent) {
    int alarmId = intent.getIntExtra(Constants.REMINDER_ALARM_ID, 0);

    Intent goingOffIntent = new Intent(context, GoingOffActivity.class);
    goingOffIntent.putExtra(Constants.REMINDER_ALARM_ID, alarmId);

    context.startActivity(goingOffIntent);
}

И это onCreate GoingOffActivity:

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_going_off);
context = this;

getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN |
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON,
        WindowManager.LayoutParams.FLAG_FULLSCREEN |
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

loadData(getIntent());

КогдаЭкран выключен, и аварийный сигнал отключается. Эти записи, созданные в журнале:

18:35:03.593 20113-20113/me.mitulat.myProgram W/MyProgram: onCreate
18:35:03.661 20113-20113/me.mitulat.myProgram W/MyProgram: onCreate finish
18:35:03.674 20113-20113/me.mitulat.myProgram W/MyProgram: onPause
18:35:03.675 20113-20113/me.mitulat.myProgram W/MyProgram: onPause finish
18:35:03.714 20113-20113/me.mitulat.myProgram W/MyProgram: onStop
18:35:03.724 20113-20113/me.mitulat.myProgram W/MyProgram: onStop finish

GoingOffActivity немедленно завершается.

Когда экран включен, но заблокирован шаблоном, это происходит:

18:30:00.503 20113-20113/me.mitulat.myProgram W/MyProgram: onCreate
18:30:00.585 20113-20113/me.mitulat.myProgram W/MyProgram: onCreate finish
18:30:00.598 20113-20113/me.mitulat.myProgram W/MyProgram: onPause
18:30:00.599 20113-20113/me.mitulat.myProgram W/MyProgram: onPause finish
18:30:00.635 20113-20113/me.mitulat.myProgram W/MyProgram: onStop
18:30:00.655 20113-20113/me.mitulat.myProgram W/MyProgram: onStop finish
18:30:00.764 20113-20113/me.mitulat.myProgram W/MyProgram: onStop
18:30:00.769 20113-20113/me.mitulat.myProgram W/MyProgram: onStop finish

Я тестирую на реальных устройствах с minSdkVersion, равным 23, в build.gradle.

Что я делаю не так?

1 Ответ

1 голос
/ 02 октября 2019

Событие с двойным жизненным циклом, на которое ссылается здесь , является известным ограничением подхода "флагов окон" к снятию с охраны и не было исправлено до API 27. Это означает, что Activityможет сделать паузу и остановить до того, как он появится на экране.

Если вы не finish() Activity, обычно это будет onResume() во второй раз, и все будет хорошо. Но если вы позвоните finish() в onPause() или onStop(), это приведет к тому, что Activity перейдет в разрушенное состояние, и вы никогда его не увидите.

Решение состоит в том, чтобыудалить все finish() вызовы, которые происходят до того, как Activity станет видимым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...