【问题标题】:Open Notification activity when clicked on Notification with firebase单击带有 Firebase 的通知时打开通知活动
【发布时间】:2017-08-01 10:14:08
【问题描述】:

我希望通知打开 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());
    }
}

【问题讨论】:

  • 你能添加你用来发送通知的代码吗?
  • 您使用的意图属于MainActivitiy.class。请参阅代码中的这一行,在 sendNotification() 内:Intent intent = new Intent(this, MainActivity.class);。将其更改为Notification.class
  • 我现在通过 firebase 发送通知,是的,我已将其更改为 Intent intent = new Intent(this, Notification.class);仍然 mainActivity 出现
  • 您是从 Firebase 控制台还是从 API 发送通知?
  • firebase 控制台

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


【解决方案1】:

可能是这样,改变意图:

 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 manifest中设置notification activity

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

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

            </intent-filter>

【讨论】:

  • 我用你的问题的解释更新了我的答案@DreamDeveloper
  • 我可以制作 API 的任何有用资源
  • 查看我对 API 实现 @DreamDeveloper 的更新答案
  • 如果我使用google api服务,我可以上传全部还是可以使用邮递员
【解决方案2】:

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

【讨论】:

  • 我试过 Intent intent = new Intent(this, NotificationActivity.class);但不工作
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-04
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多