繁体   English   中英

单击带有Firebase的通知时打开通知活动

[英]Open Notification activity when clicked on Notification with firebase

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

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());
    }
}

可能是这样,更改意图:

 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>

从服务器发送到应用程序的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>

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

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());
}

修改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());
    } 

在您提供的代码中找不到对sendNotification()的调用。 我非常确定您看到的通知来自Firebase,而不是sendNotification() 参见本页 如果您的应用程序在后台,并且通知有效负载包含通知部分,那么您的通知将传递到系统托盘,单击该按钮将启动启动器活动,以捆绑的形式将通知中的所有数据传递到启动器活动。

为了解决你的问题只发送数据报文,并调用sendNotification()在适当位置onMessageReceived()意图对Notification.class

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM