【问题标题】:Android bring app to foreground on Firebase notificationAndroid 在 Firebase 通知中将应用程序置于前台
【发布时间】:2021-04-05 03:44:17
【问题描述】:

我有以下代码,一旦我收到 Firebase 推送通知或 FCM,就会将我的 Android 应用程序带到前台。

@ReactMethod
public void backToForeground() {

    Context context = getAppContext();
    String packageName = context.getApplicationContext().getPackageName();
    Intent focusIntent = context.getPackageManager().getLaunchIntentForPackage(packageName).cloneFilter();
    Activity activity = getCurrentActivity();
    boolean isOpened = activity != null;

    if (isOpened) {
        focusIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
        activity.startActivity(focusIntent);
    } else {

        // Custom flag to check whether app was started from this method
        focusIntent.putExtra("FLAG_ON_CALL_BRING_TO_FRONT", "true");

        focusIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK +
                WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED +
                WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD +
                WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);

        getReactApplicationContext().startActivity(focusIntent);

    }

}

现在在 MainActivity 中,我使用了如下捆绑包:

@Override
protected void onCreate(Bundle savedInstanceState) {
SplashScreen.show(this);
super.onCreate(savedInstanceState);
  Bundle extras = getIntent().getExtras();

        if (extras != null) {

            // Custom flag defined in AppStateManagerModule
            String extraString = extras.getString("FLAG_ON_CALL_BRING_TO_FRONT");

            if (extraString != null) {
                getWindow()
                        .addFlags(
                                WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                                        WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                                        WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                                        WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                        );
            }
        }
}

我的代码在以下情况下可以正常工作:

当设备接收到 FCM 时:

  1. 如果应用已打开,则会执行操作
  2. 如果应用处于后台(即最小化),应用会打开并执行操作
  3. 如果应用被终止,应用会打开并执行操作
  4. 如果应用被终止并且手机被锁定,应用会在锁定屏幕顶部打开,然后执行操作

下面是不能正常工作的情况:

  1. 如果我在前台启动我的应用程序,或者如果它最小化并锁定我的手机,我的应用程序运行良好并且我的代码将其置于前面,它会执行所需的操作,但它不会显示在锁的顶部屏幕。

第 5 点中的操作执行得很好,但它没有显示在锁定屏幕的顶部。

【问题讨论】:

  • 你的意思是即使屏幕被锁定也要显示它?
  • @FaiiziiAwan 是的...如果应用程序被杀死并且屏幕被锁定,它会很好地启动应用程序但是如果没有被杀死但屏幕被锁定,那么它不会启动应用程序锁屏
  • 你的通知有两个标签(通知和数据)对吧?
  • 是的,正如我所说,上述所有情况都正常工作,除了一个
  • 您是否注意到您没有添加自定义标签是您的应用已经在运行?

标签: android firebase


【解决方案1】:

如果应用程序处于活动状态或处于后台,则在手机锁定后仍将被视为处于活动状态。因此,由于 Activity 处于活动状态,因此不能有意将其抛到顶部,因为它已经用于激活该 Activity。

我们需要在一个活动的 Activity 上添加窗口标志,以将其置于前面,如下所示:

 if (isOpened) {

    focusIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

    activity.startActivity(focusIntent);

    // Adding Window Flags to bring app forward on lock screen

    activity.runOnUiThread(new Runnable() {

        @Override
        public void run() {

            activity.getWindow()
                    .addFlags(
                            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
                                    WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
                                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
                    );
                    
        }
    });

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多