[英]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.