Как запустить приложение React Native на экране блокировки устройства? - PullRequest
0 голосов
/ 08 февраля 2019

Я создаю приложение VoIP на React Native, которое обнаруживает входящие звонки с помощью push-уведомлений.Мне нужно запустить приложение и вывести его на передний план при получении push-уведомления.Я могу добиться этого для следующих сценариев:

  1. Когда устройство разблокировано и:
    • Приложение свернуто (все еще в фоновом режиме)
    • Приложение не в фоновом режиме (убит из многозадачного просмотра)
  2. Когда устройство заблокировано и:
    • Приложение свернуто (все еще в фоновом режиме)

Единственный сценарий, с которым я не могу справиться, это когда устройство заблокировано и приложение убито.Приложение запускается, но не отображается на экране блокировки.Вместо этого пользователю необходимо разблокировать телефон для доступа к приложению.

Вот фрагмент кода, который запускается при получении уведомления,

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Intent notificationIntent = new Intent(this, MainActivity.class);
    // Check if app is running

    if(MainActivity.isAppRunning) {
        startActivity(notificationIntent);
        Intent messagingEvent = new Intent(MESSAGE_EVENT);
        messagingEvent.putExtra("message", remoteMessage);
        // Broadcast it so it is only available to the RN Application
        LocalBroadcastManager
                .getInstance(this)
                .sendBroadcast(messagingEvent);
    } else {
        startActivity(notificationIntent);
        try {
            // If the app is in the background we send it to the Headless JS Service
            Intent headlessIntent = new Intent(
                    this.getApplicationContext(),
                    BackgroundListenService.class
            );
            headlessIntent.putExtra("message", remoteMessage);
            this
                    .getApplicationContext()
                    .startService(headlessIntent);
            Log.d(TAG, "message: " + remoteMessage);
            HeadlessJsTaskService.acquireWakeLockNow(this.getApplicationContext());
        } catch (IllegalStateException ex) {
            Log.e(
                    TAG,
                    "Background messages will only work if the message priority is set to 'high'",
                    ex
            );
        }
    }
}

А вот мой MainActivity:

public class MainActivity extends NavigationActivity {

  public static boolean isAppRunning;
  private static boolean isMessageRecieved;

    private class MessageReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            isMessageRecieved=true;
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
            window.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
            window.addFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
            window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
            window.clearFlags(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
        }
    }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    SplashScreen.show(this);
    super.onCreate(savedInstanceState);
    isAppRunning = true;

      LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
      // Subscribe to message events
      localBroadcastManager.registerReceiver(
          new MainActivity.MessageReceiver(),
          new IntentFilter(MyFirebaseMessagingService.MESSAGE_EVENT)
      );

      if(isMessageRecieved) {
          Window window = getWindow();
          window.clearFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
          window.clearFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
          window.clearFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
          window.clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
          window.clearFlags(WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY);
      }

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    String channelId = "1";
    String channel2 = "2";

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
      NotificationChannel notificationChannel = new NotificationChannel(channelId,
              "Channel 1",NotificationManager.IMPORTANCE_HIGH);

      notificationChannel.setDescription("This is BNT");
      notificationChannel.setLightColor(Color.RED);
      notificationChannel.enableVibration(true);
      notificationChannel.setShowBadge(true);
      notificationManager.createNotificationChannel(notificationChannel);

      NotificationChannel notificationChannel2 = new NotificationChannel(channel2,
              "Channel 2",NotificationManager.IMPORTANCE_MIN);

      notificationChannel.setDescription("This is bTV");
      notificationChannel.setLightColor(Color.RED);
      notificationChannel.enableVibration(true);
      notificationChannel.setShowBadge(true);
      notificationManager.createNotificationChannel(notificationChannel2);

    } 
  }
   @Override
    protected void onDestroy() {
        super.onDestroy();
        isAppRunning = false;
    }

    @Override
    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
    }

}
...