仅在应用处于后台时发送推送通知

时间:2018-02-24 17:18:34

标签: android push-notification background foreground

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

当我的应用处于前台和后台时,会显示推送通知,但只有当我的应用在后台时才会显示。

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

当我的整个应用程序处于后台时,还有另一种显示推送通知的方法吗?

2 个答案:

答案 0 :(得分:0)

所以我找到了解决这个问题的正确和非常好的解决方案。 根据这个答案:https://stackoverflow.com/a/42679191/6938043

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

答案 1 :(得分:0)

我认为您有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();
    }
}

希望有所帮助!