代码之家  ›  专栏  ›  技术社区  ›  Leschge

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

  •  1
  • Leschge  · 技术社区  · 7 年前

    我使用NotificationManager、NotificationChannel和NotificationCompat。生成器在触发事件时显示推送通知,无在线Firebase。

    推送通知在我的应用程序位于前台和后台时显示,但它只应在我的应用程序位于后台时显示。

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

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

    2 回复  |  直到 5 年前
        1
  •  3
  •   Reaz Murshed vir us    7 年前

    我想你有 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();
        }
    }
    

    希望有帮助!

        2
  •  0
  •   Leschge    7 年前

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