Запустить активность от FCM - PullRequest
0 голосов
/ 18 мая 2018

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

FirebaseMessagingService:

@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 до запуска операции, но она устарела.

1 Ответ

0 голосов
/ 18 мая 2018

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

@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"
    >
...