FCM通知未开启预期活动Android

时间:2017-05-29 04:37:51

标签: android firebase push-notification

我正在尝试通过FCM控制台生成通知,但我收到了这些通知,但我无法覆盖FirebaseMessagingService的onMessageReceived。不知道我做错了什么。

负责处理通知的

MyFirebaseMessagingService 类:

public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "MyFirebaseMsgService";

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {

        Log.d(TAG, "FROM:" + remoteMessage.getFrom());

        //Check if the message contains data
        if(remoteMessage.getData().size() > 0) {
            Log.d(TAG, "Message data: " + remoteMessage.getData());
        }

        //Check if the message contains notification

        if(remoteMessage.getNotification() != null) {
            Log.d(TAG, "Mesage body:" + remoteMessage.getNotification().getBody());
            sendNotification(remoteMessage.getNotification().getBody(),remoteMessage.getData());
        }
    }

    /**
     * Dispay the notification
     * @param body
     */
    private void sendNotification(String body , Map<String,String> data) {

//        int finalSecId = Integer.parseInt((String) data.get("sec_id"));
//        int sec = Integer.parseInt((String) data.get("sec"));
        Intent intent = new Intent(this, InsuranceActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0/*Request code*/, intent, PendingIntent.FLAG_ONE_SHOT);
        //Set sound of notification
        Uri notificationSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notifiBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.login_meter)
                .setContentTitle(getString(R.string.app_name))
                .setContentText((String) data.get("sec_id")+ " "+(String) data.get("sec"))
                .setAutoCancel(true)
                .setSound(notificationSound)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0 /*ID of notification*/, notifiBuilder.build());
    }
}

内部应用程序标记

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

5 个答案:

答案 0 :(得分:2)

有两种类型的FCM

通知消息:仅当您的应用处于前台时,使用此消息类型发送有效内容才会触发onMessageReceived()。

数据消息:仅使用此特定消息类型发送有效负载会触发onMessageReceived(),无论您的应用是否位于前台/后台。

参考:here

答案 1 :(得分:1)

我遇到了处理来自FCM的通知的问题。

首先,我们必须了解有两种类型的通知。

  1. 通知 - 当您的应用不在前台并生成通知时,它会触发。如果您点击它,它将打开启动器活动。

  2. 数据通知 - 这个用于解析数据,它在后台和前台接收。因此,您可以根据FCM推送在数据对象中提供的数据构建自定义通知。

     Map<String ,String> dataMap = remoteMessage.getData();
    

    这里我创建了一个带键值对的简单Map。现在,我可以在数据对象中收到通知的标题,并使用自定义意图进行简单通知。

  3. 我个人使用上下文对象来确定应用程序是在前台还是后台。基于此我决定是否必须显示通知或仅更新数据。

    希望这有帮助。

答案 2 :(得分:1)

扩展#Sudip Podder评论和#Ratilal Chopda答案 请按照以下步骤操作:

<强>步骤1:

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

<强>步骤2:

我在服务器上使用php,因此您需要按照自己喜欢的方式调整内容,但在通知有效负载中添加"click_action" : ".SplashActivity"

 $fields = array(
            'to' => $token,
            'notification' => array(
                'title' => 'Motors City',
                'body' => $message,
                "click_action" => ".AppSplash",

            ),
            'data' => array(
                'sec_id' => $secID,
                'sec' => $sec,
                'extra1'=>$extra1,
                'extra2'=>$extra2
            )
        );

        $headers = array(
            'Authorization:key=' . $server_key,
            'Content-Type:application/json'
        );

<强>步骤3: 在您的SplashActivity

的Oncreate中
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
  Log.d(TAG,bundle.toString);
}}

你完成了

答案 3 :(得分:0)

现在您在通知类型中有通知,触发通知默认,只需点击通知即可打开应用。

因此,您需要将服务器端代码从通知类型更改为数据类型。 并尝试从

获取消息
`remoteMessage.getData()`  not from `remoteMessage.getNotification()`

如果您想管理点击通知使用数据类型通知。要了解有关此类型的更多信息,请通过此链接 https://firebase.google.com/docs/cloud-messaging/concept-options

答案 4 :(得分:-1)

试试这个

 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT);