我使用NotificationManager,NotificationChannel和NotificationCompat.Builder在触发事件时显示推送通知,而不是在线Firebase。
当我的应用处于前台和后台时,会显示推送通知,但只有当我的应用在后台时才会显示。
我有2个活动,其中只有1个人知道创建推送通知的类。我可以设置一个变量来显示我的Activity是否在前台(使用onResume和onPause),但是如果我的其他Activity启动了Activity,并且通知触发器类是在后台设置的,因此我不能使用它方法。我需要知道整个应用程序是否在前台,但我没有找到解决该问题的好方法。
当我的整个应用程序处于后台时,还有另一种显示推送通知的方法吗?
答案 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();
}
}
希望有所帮助!