簡體   English   中英

Android 在 Firebase 通知上將應用程序帶到前台

[英]Android bring app to foreground on Firebase notification

一旦我收到 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 點執行得很好,但它沒有顯示在鎖定屏幕的頂部。

如果應用程序處於活動狀態或在后台,則在手機鎖定后它仍將被視為活動狀態。 因此,由於活動處於活動狀態,因此不能有意將其拋到頂部,因為它已經用於激活活動。

我們需要在活動活動上添加 window 標志,以將其置於最前面,如下所示:

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

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM