打开通知活动时点击通知与firebase
我想通知打开Notification.class活动,而不是MainActivity。我已将代码更改为:打开通知活动时点击通知与firebase
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);
所以要澄清你火力控制台不可能只从API开放比MainActivity其他活动。
为什么:
因为两件事情。
一个:
从控制台发出的通知不火onMessageReceived()。
两个:
的火力cosole通知没有possibily设置点击动作。
的方式来解决:
从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_动作,在Android清单组这里面通知actifity:
<intent-filter>
<action android:name="Notification" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
试图不工作 –
我我的答案更新您的问题的解释@DreamDeveloper –
任何有用的resouces,我可以让API –
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。在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());
}
我试过 Intent intent = new Intent(this,NotificationActivity.class); 但无法正常工作 –
我没有在您提供的代码中找到sendNotification()
的调用。我确定您看到的通知是从Firebase而不是从sendNotification()
。请参阅this page。如果您的应用程序处于后台并且通知有效内容包含通知部分,则您的通知将传递到系统托盘,然后通过点击启动Launcher活动将任何数据从通知传递到Launcher活动。
要解决您的问题,请只发送数据消息,并在onMessageReceived()
的适当位置拨打sendNotification()
,意图为Notification.class
。
您可以添加用于发送通知的代码吗? –
您正在使用的意图属于'MainActivitiy.class'。在你的代码中,在'sendNotification()'内部看到这一行:'Intent intent = new Intent(this,MainActivity.class);'。将其更改为'Notification.class' – ZeekHuge
我现在通过Firebase发送通知, 是的,我已将其更改为意图intent = new Intent(this,Notification.class);仍然mainActivity显示 –