Java 禁用仅在后台接收的通知

Java 禁用仅在后台接收的通知,java,android,firebase,push-notification,firebase-cloud-messaging,Java,Android,Firebase,Push Notification,Firebase Cloud Messaging,我使用firebase云消息和firebase功能构建了一个聊天应用程序。但是我现在有两个问题。 1.当应用程序处于打开状态且收到新消息时,应用程序将自动移动到应用程序的主要活动。 2.第二,我希望只在后台接收通知 如何实现这一点? 下面是我收到的onMessageReceived public class MyFirebaseMessagingService extends FirebaseMessagingService { @Override public void onM

我使用firebase云消息和firebase功能构建了一个聊天应用程序。但是我现在有两个问题。 1.当应用程序处于打开状态且收到新消息时,应用程序将自动移动到应用程序的主要活动。 2.第二,我希望只在后台接收通知

如何实现这一点?

下面是我收到的onMessageReceived

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        // Check if message contains a data payload.
        if (remoteMessage.getData().size() > 0) {
            showNotification(remoteMessage.getData().get("name"), (remoteMessage.getData().get("click_action")), remoteMessage.getData().get("title"));
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {

        }
    }

    private void showNotification(String name, String click_action, String title) {
        Intent intent;

        if (click_action.equals("Download")) {
            intent = new Intent(this, Download.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        } else if (click_action.equals("Student_SystemsDevt")) {
            intent = new Intent(this, Student_SystemsDevt.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        }
        else {
            intent = new Intent(this, LoginActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        }

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setContentTitle(title)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentText(name)
                .setAutoCancel(true)
                .setStyle(new NotificationCompat.BigTextStyle())
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}
我的清单文件

<application
    android:name=".GTUCONLINE"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity
        android:name=".LoginActivity"
        android:screenOrientation="portrait"
        android:theme="@style/MyTheme" />
    <activity android:name=".MainActivity">
    </activity>
    <activity
        android:name=".ChoiceActivity"
        android:screenOrientation="portrait"
        android:theme="@style/MyTheme" />
    <activity
        android:name=".WelcomeActivity"
        android:screenOrientation="portrait"
        android:theme="@style/MyTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.theartofdev.edmodo.cropper.CropImageActivity"
        android:theme="@style/Base.Theme.AppCompat" />
    <activity
        android:name=".StudentSignUp"
        android:screenOrientation="portrait"
        android:theme="@style/MyTheme" />
    <activity
        android:name=".LecturerSignUp"
        android:screenOrientation="portrait" />
    <activity android:name=".ProgrammeActivity" />

    <service android:name=".MyFirebaseInstanceIDService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
        </intent-filter>
    </service>
    <service android:name=".MyFirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <activity
        android:name=".TopicActivity"
        android:theme="@style/MyTheme" />
    <activity android:name=".MIS" />
    <activity android:name=".GB" />
    <activity android:name=".FIN" />
    <activity android:name=".ENGINEERINGM" />
    <activity android:name=".BDM" />
    <activity android:name=".SCM" />
    <activity android:name=".TE" />
    <activity android:name=".TM" />
    <activity android:name=".BET" />
    <activity android:name=".ICT" />
    <activity android:name=".T" />
    <activity android:name=".IT" />
    <activity android:name=".AM" />
    <activity android:name=".OGM" />
    <activity android:name=".I" />
    <activity android:name=".PEF" />
    <activity android:name=".QM" />
    <activity android:name=".EPM" />
    <activity android:name=".PM" />
    <activity android:name=".HM" />
    <activity android:name=".StudentsList">
        <intent-filter>
            <action android:name="StudentsList" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".LecturersList" />
    <activity android:name=".AdminActivity" />
    <activity
        android:name=".ChatActivity"
        android:parentActivityName=".StudentsList" />
    <activity android:name=".LecturerMainActivity" />
    <activity
        android:name=".Download"
        android:parentActivityName=".MIS">
        <intent-filter>
            <action android:name="Download" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MIS_Information"
        android:parentActivityName=".MIS" />
    <activity android:name=".Terms" />
    <activity
        android:name=".Admin_Login"
        android:parentActivityName=".LoginActivity" />
    <activity
        android:name=".Manipulation"
        android:parentActivityName=".Admin_Login" />
    <activity android:name=".Admins" />
    <activity
        android:name=".SystemsDevt"
        android:parentActivityName=".MIS" />
    <activity
        android:name=".SysGroupChat"
        android:parentActivityName=".SystemsDevt" />
    <activity
        android:name=".EntSystems"
        android:parentActivityName=".MIS" />
    <activity android:name=".DownloadEnt">
        <intent-filter>
            <action android:name="DownloadEnt" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".student_mis" />
    <activity
        android:name=".Student_SystemsDevt"
        android:parentActivityName=".student_mis">
        <intent-filter>
            <action android:name="Student_SystemsDevt" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity
        android:name=".Student_EntSys"
        android:parentActivityName=".student_mis" />
    <activity
        android:name=".SystemsDevt_Add"
        android:parentActivityName=".SystemsDevt" />
    <activity android:name=".EntSystemsAdd" />
    <activity android:name=".EntSystemsInfo" />
    <activity
        android:name=".DatabaseSystems"
        android:parentActivityName=".MIS" />
    <activity android:name=".DownloadDatabaseSys" />
    <activity
        android:name=".Student_DatabaseSystems"
        android:parentActivityName=".student_mis" />
    <activity android:name=".DatabaseInfo" />
    <activity
        android:name=".DatabaseAdd"
        android:parentActivityName=".DatabaseSystems" />
    <activity
        android:name=".IntroToOil"
        android:parentActivityName=".GB" />
    <activity
        android:name=".DownloadIntro"
        android:parentActivityName=".IntroToOil" />
    <activity
        android:name=".IntroToOilInfo"
        android:parentActivityName=".IntroToOil" />
    <activity
        android:name=".IntroToOilAdd"
        android:parentActivityName=".IntroToOil" />
    <activity android:name=".student_gb" />
    <activity android:name=".StudentIntro" />
    <activity android:name=".MIS_students_new"
        android:parentActivityName=".SystemsDevt">

    </activity>
</application>

还可以在清单中添加任务权限

private boolean isAppForeground(){
ActivityManager ActivityManager=(ActivityManager)getSystemService(Context.ACTIVITY_服务);
List appProcesses=activityManager.getRunningAppProcesses();
if(appprocesss==null){
返回false;
}
最后一个字符串packageName=getPackageName();
对于(ActivityManager.RunningAppProcessInfo appProcess:AppProcesss){
if(appProcess.importance==ActivityManager.RunningAppProcessInfo.importance\u前台和&appProcess.processName.equals(packageName)){
返回true;
}
}
返回false;
} 
if(isAppForeground()){
//以静默方式处理通知,而不在通知托盘中显示
}否则{
//做你经常做的事情
//检查消息是否包含数据有效负载。
如果(remoteMessage.getData().size()>0){
showNotification(remoteMessage.getData().get(“名称”),(remoteMessage.getData().get(“单击操作”)),remoteMessage.getData().get(“标题”);
}
//检查消息是否包含通知负载。
if(remoteMessage.getNotification()!=null){
}
}

1-实际上,只有当应用程序处于前台时,才会触发onMessageReceived,如前所述。所以,如果您不覆盖onMessageReceived,当您的应用程序位于前台时,您将不会收到推送

2-根据fcm文档,当你的应用程序在后台时,onMessageReceived不会被触发,但是

数据有效载荷是在您的发射器活动的目的的额外部分中交付的

它解释了为什么推送会重定向到主要活动(启动器)

到目前为止,您可以处理来自意图的重定向

您还可以指定要重定向的活动,如:

不要忘记所需活动的意图过滤器:

<intent-filter>
   <action android:name="OPEN_ACTIVITY_1" />
   <category android:name="android.intent.category.DEFAULT" />
</intent-filter>


您的应用程序是收到数据通知还是简单推送通知?它收到数据通知此答案将帮助您如何使用此功能?类ForegroundCheckTask应放在MyFirebaseMessagingService类之外,其余代码应放在onMessageRecived()中现在重试我已经删除了上下文。我没有收到通知,但当我在应用程序中时,我被重定向回主活动。有趣的是,这不是我的问题。在if()条件下,您是如何处理静默通知的?因为挂起的意图也可能是跳转的原因。那么如何修复自动重定向?请在“click_action”字段中指定您当前正在尝试的活动。一分钟自动重定向仍然持续。我不担心用户单击通知以打开特定活动。我想知道如何解决当用户在另一个活动中时自动重定向的问题。应用程序总是在弹出通知之前将用户重定向回主活动。我该如何解决这个问题?
{
  "to":"some_device_token",
  "content_available": true,
  "notification": {
    "title": "hello",
    "body": "test message",
    "click_action": "OPEN_ACTIVITY_1"
  },
  "data": {
    "extra":"juice"
  }
}
<intent-filter>
   <action android:name="OPEN_ACTIVITY_1" />
   <category android:name="android.intent.category.DEFAULT" />
</intent-filter>