我希望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());
}
}
答案 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
。