如何通过设备锁定屏幕冷启动 React Native 应用程序?

问题描述 投票:0回答:1

我正在 React Native 上构建一个 VoIP 应用程序,它使用推送通知检测来电。我需要启动应用程序并在收到推送通知时将其带到前台。我能够在以下场景中实现这一目标:

  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
            );
        }
    }
}

这是我的主要活动:

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);
    }

}
java android react-native react-native-navigation
1个回答
0
投票

在AndroidManifest.xml文件中,需要设置:

<activity android:name=".MainActivity"
    ...
    android:showWhenLocked="true"
    android:turnScreenOn="true"
>

可能还有这个权限

<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
© www.soinside.com 2019 - 2024. All rights reserved.