仅当应用程序处于后台时发送推送通知

Sending a push notification only when app is in background

我使用 NotificationManager、NotificationChannel 和 NotificationCompat.Builder 在触发事件时显示推送通知,没有在线 Firebase。

推送通知在我的应用处于前台和后台时出现,但它只应在我的应用处于后台时出现。

我有 2 个活动,其中只有 1 个知道创建推送通知的 class。我可以只设置一个变量来显示我的 Activity 是否在前台(使用 onResume 和 onPause),但是如果我的另一个 Activity 启动 Activity 通知触发器 class 在后台设置,因此我不能使用此方法。我需要知道整个应用程序是否在前台,但我没有找到解决该问题的好方法。

那么有没有其他方法可以在我的整个应用程序处于后台时显示推送通知?

所以我找到了解决这个问题的合适且非常好的解决方案。 根据这个答案:

Application.ActivityLifecycleCallbacks

public class MainActivityChats extends AppCompatActivity implements Application.ActivityLifecycleCallbacks 
{
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getApplication().registerActivityLifecycleCallbacks(this);
    }

    public void onActivityResumed(Activity activity)
    {
        if(msg_updater != null)
        {
            msg_updater.set_app_is_active(true);
        }

    }
    public void onActivityPaused(Activity activity)
    {
        if(msg_updater != null)
        {
            msg_updater.set_app_is_active(false);
        }
    }

    public void onActivityStopped(Activity activity) {}
    public void onActivityCreated(Activity activity, Bundle bundle) {}
    public void onActivityStarted(Activity activity) {}
    public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {}
    public void onActivityDestroyed(Activity activity) {}
}

我认为您可以 FCMListenerService 接收作为后台服务的推送通知。 Service 清单文件中应包含以下声明。

<service android:name=".Service.FCM.FCMListenerService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

现在您可以单独传递此服务的上下文来检查应用程序是在前台还是在后台。检查应用程序是否在前台的功能如下。

private static boolean isForeground(Context context) {
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> runningTaskInfo = manager.getRunningTasks(1);
    ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
    return componentInfo.getPackageName().equals(Constants.ApplicationPackage);
}

因此,在您的 onMessageReceived 函数中,您需要检查应用程序是否在前台并且不要在状态栏中创建通知。

public class FCMListenerService extends FirebaseMessagingService {

    @Override
    public void onMessageReceived(RemoteMessage message) {
        if(!isForeground(this)) createNotification();
    }
}

希望对您有所帮助!