【问题标题】:Sending a push notification only when app is in background仅在应用程序处于后台时发送推送通知
【发布时间】:2018-08-04 13:16:41
【问题描述】:

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

当我的应用程序在前台和后台时会出现推送通知,但它应该只在我的应用程序在后台时出现。

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

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

【问题讨论】:

标签: java android push-notification background foreground


【解决方案1】:

所以我为这个问题找到了一个合适且非常好的解决方案。 根据这个答案: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) {}
}

【讨论】:

    【解决方案2】:

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

    希望有帮助!

    【讨论】:

      猜你喜欢
      • 2019-02-25
      • 2020-10-22
      • 2022-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多