Запуск активности из FCM

В моем приложении мне нужно запустить действие и включить экран, когда получено высокоприоритетное сообщение FCM. Это тревожная активность, которая очень и очень важна для пользователей. На большинстве устройств Android код работает нормально. Однако на некоторых устройствах Huawei или LG активность не запускается, когда устройство находится в режиме ожидания или в кармане (датчик приближения). Поведение должно быть похоже на будильники, звонки и т. д. Вот мой код:

Служба FirebaseMessaging:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
     Intent dialogIntent = new Intent(getBaseContext(), AlarmActivity.class);
     dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
     dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
     dialogIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
     dialogIntent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
     getApplication().startActivity(dialogIntent);
}

Тревожная активность:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // set flags so an activity fire on the screen
    getWindow().addFlags(
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
    );

    setContentView(R.layout.activity_alarm);
    .
    .
}

Я хотел использовать SCREEN_BRIGHT_WAKE_LOCK перед запуском действия, но это устарело.


person Kelib    schedule 18.05.2018    source источник
comment
Посмотрите, регистрирует ли система какие-либо сообщения в LogCat, связанные с неудачным запуском активности. Или посоветуйте пользователям добавить ваше приложение в белый список оптимизации батареи.   -  person CommonsWare    schedule 18.05.2018
comment
Белый список оптимизации батареи не помогает. Я постараюсь получить устройство, которое не работает должным образом. Об этой проблеме сообщают пользователи, на моих отладочных устройствах она работает хорошо.   -  person Kelib    schedule 18.05.2018


Ответы (1)


Я использую в своей деятельности этот код:

@Override
protected void onCreate(Bundle savedInstanceState) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    setShowWhenLocked(true);
                    setTurnScreenOn(true);
                    KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
                    if (keyguardManager != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        keyguardManager.requestDismissKeyguard(this, null);
                    }
                } else {
                    //noinspection deprecation
                    getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    );
                }
    }
    .....
}

Чтобы предотвратить различное поведение на разных устройствах, я использую в своем макете активности следующее:

<android.support.design.widget.CoordinatorLayout
    ....
    android:keepScreenOn="true"
    >
person MeLine    schedule 18.05.2018
comment
Ваш код работает надежно? Об этих проблемах сообщалось на Android N, поэтому единственная разница заключается в использовании атрибута keepScreenOn в ресурсе макета. - person Kelib; 18.05.2018
comment
вы заметили setShowWhenLocked(true); установитьTurnScreenOn (истина); методы. Я протестировал его на нескольких SDK, и он работает. - person MeLine; 18.05.2018
comment
Это методы, доступные в Android O. В Android N, где возникает проблема, вы используете те же флаги. Тем не менее, спасибо за ваш ответ, я добавлю его в свой код, чтобы лучше ориентироваться на Oreo. - person Kelib; 18.05.2018