单击带有firebase的Notification时打开Notification活动

时间:2017-08-01 10:14:08

标签: java android firebase notifications firebase-cloud-messaging

我希望Notification打开Notification.class活动而不是MainActivity。我已将代码更改为:

Intent intent = new Intent(this, Notification.class);

但是当收到通知并点击它时,它仍会打开MainActivity。 我看了很多例子,但无法获得我需要改变的地方而不是MainActivity。

通知作为用户段从firebase控制台发送。

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.firebase.jobdispatcher.FirebaseJobDispatcher;
import com.firebase.jobdispatcher.GooglePlayDriver;
import com.firebase.jobdispatcher.Job;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseMsgService";

    /**
     * Called when message is received.
     *
     * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
     */
    // [START receive_message]
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
               // TODO(developer): Handle FCM messages here.
        Log.d(TAG, "From: " + remoteMessage.getFrom());

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

            if (/* Check if data needs to be processed by long running job */ true) {
                // For long-running tasks (10 seconds or more) use Firebase Job Dispatcher.
                scheduleJob();
            } else {
                // Handle message within 10 seconds
                handleNow();
            }

        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }


    }

    private void scheduleJob() {
        // [START dispatch_job]
        FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));
        Job myJob = dispatcher.newJobBuilder()
                .setService(MyJobService.class)
                .setTag("my-job-tag")
                .build();
        dispatcher.schedule(myJob);
        // [END dispatch_job]
    }

    /**
     * Handle time allotted to BroadcastReceivers.
     */
    private void handleNow() {
        Log.d(TAG, "Short lived task is done.");
    }

    /**
     * Create and show a simple notification containing the received FCM message.
     *
     * @param messageBody FCM message body received.
     */
    private void sendNotification(String messageBody) {
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.notification_bg)
                .setContentTitle("FCM Message")
                .setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 })
                .setLights(Color.RED, 3000, 3000)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

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

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

4 个答案:

答案 0 :(得分:4)

可能就是这样,改变了对此的意图:

 Intent intent = new Intent(this, Notification.class);

因此,澄清来自 firebase控制台的您无法仅通过API打开除MainActivity之外的其他活动。

<强>为什么

由于两件事。

<强>一个

从控制台发送的通知不会触发onMessageReceived()。

<强>两个

firebase cosole通知无法设置点击操作。

修复方法

从API发送通知并设置click_actions。

示例:

<?php



#API access key from Google API's Console



    define( 'API_ACCESS_KEY', 'YOUR_API_KEY');



    $topic = "/topics/todos";



$url = 'https://fcm.googleapis.com/fcm/send';

$fields = array (

        'to' => $topic,

        'notification' => array (

                "body" => "nova casa adicionada",

                "title" => "Nova casa",

                "sound"=> "default",

                "click_action"=> "Notification"

        ),

        'data' => array(

            "localcasa" => "Porto",

            "precocasa"=> "1.600.000 €",

            "imgurl"=> "http://brunoferreira.esy.es/imgsandroid/casa10.jpg",

            "infocs"=> "Apartamento localizado em local premium da cidade do Porto, à Avenida Marechal Gomes da Costa, onde pode viver-se com toda a calma e descontração. No ponto mais elevado da Foz, com vista de mar e uma envolvente de luxo, rodeado por moradias, com exteriores amplos e vistas deslumbrantes. É constituída por 4 quartos, 5 casas de banho e uma garagem em que tem a capacidade para 2 carros.",

            "csid"=> "10"

        )

);

$fields = json_encode ( $fields );

$headers = array (

        'Authorization: key=' . API_ACCESS_KEY,

        'Content-Type: application/json'

);



$ch = curl_init ();

curl_setopt ( $ch, CURLOPT_URL, $url );

curl_setopt ( $ch, CURLOPT_POST, true );

curl_setopt ( $ch, CURLOPT_HTTPHEADER, $headers );

curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );

curl_setopt ( $ch, CURLOPT_POSTFIELDS, $fields );



$result = curl_exec ( $ch );

curl_close ( $ch );



?>

要设置 click_ action ,请在 android清单中设置通知语言

<intent-filter>
                <action android:name="Notification" />

                <category android:name="android.intent.category.DEFAULT" />

            </intent-filter>

答案 1 :(得分:1)

  

json从服务器发送到应用程序

{

   "notification": {
   "title": "Title",
   "text": "notification",
   "icon": "ic_launcher",
   "click_action": "NOTIFICATION_ACTIVITY"
   }
}
  

将其放入Android Menifest:

<activity
          android:name=".acitivy.MainActivity"
          android:screenOrientation="portrait"
          android:theme="@style/AppTheme" >

        <intent-filter>
           <action android:name="NOTIFICATION_ACTIVITY" />

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

</activity>
  

在sendNotification方法的MyFirebaseMessagingService.class中添加以下内容:

private void sendNotification(RemoteMessage remoteMessage, String messageBody) {
    Intent intent = new Intent(this, MainActivity.class);

    **//Add this line**
    Map<String, String> extra = remoteMessage.getData();
    for (Map.Entry<String, String> entry : extra.entrySet()) {
        intent.putExtra(entry.getKey(), entry.getValue());
    }

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

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setDefaults(Notification.DEFAULT_ALL)
            .setSmallIcon(Build.VERSION.SDK_INT > 20 ?  R.drawable.notification_icon_white : R.mipmap.ic_launcher_normal)
            //.setLargeIcon(Build.VERSION.SDK_INT > 20 ?  BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon_white) : BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_normal))
            .setContentTitle(getString(R.string.app_name))
            .setDefaults(NotificationCompat.DEFAULT_SOUND | NotificationCompat.DEFAULT_VIBRATE | NotificationCompat.DEFAULT_LIGHTS)
            .setColor(ContextCompat.getColor(this, R.color.colorPrimary))
            .setPriority(Notification.PRIORITY_HIGH)
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setStyle(new NotificationCompat.BigTextStyle().bigText(messageBody))
            .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

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

    notificationBuilder.build().flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(getID(), notificationBuilder.build());
}

答案 2 :(得分:1)

修改sendNotifcation方法中的代码。如您所见,您已撰写MainAcitivity.class而不是NotificationActivity.class。我猜这是一个错字

  /** 
     * Create and show a simple notification containing the received FCM message. 
     * 
     * @param messageBody FCM message body received. 
     */ 
    private void sendNotification(String messageBody) {
        Intent intent = new Intent(this, NotificationActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.drawable.notification_bg)
                .setContentTitle("FCM Message") 
                .setVibrate(new long[] { 1000, 1000, 1000, 1000, 1000 }) 
                .setLights(Color.RED, 3000, 3000)
                .setContentText(messageBody)
                .setAutoCancel(true) 
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

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

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    } 

答案 3 :(得分:0)

我在您提供的代码中未找到sendNotification()的来电。我确信您看到的通知来自 Firebase ,而不是来自sendNotification()。见this page。如果您的应用程序在后台并且通知有效负载包含通知部分,那么您的通知将被发送到系统托盘,在单击启动时,Launcher活动会以通知的形式将任何数据从通知传递到Launcher活动。

要解决您的问题,请仅发送数据消息并在sendNotification()的适当位置致电onMessageReceived(),意图Notification.class