Now, Google Inc removed
GCM and start using FCM to push notification.
We 'll instruction to
you How to intergrate Firebase to your backend, so that you can send messages
from your server.
While sending message
using firebase, you can choose to single user or to group of users using a
topic name, or to list registrationsId (like GCM).
1. Firebase Message
1.1. Sending to single
user.
{
"to": "dfdwffdfds-8:PA91bafadsaEUIb2JewYCIMu5JfI5Ak...", "data": { "message": "Firebase Cloud Messaging Topic Message Sample!", } } |
1.2. Sending to topic
{
"to": "/topics/news", "data": { "message": "Firebase Cloud Messaging Topic Message Sample!", } } |
1.3. Sending to
list registrationsId.
{
"registration_ids": "dfdwffdfds-8:PA91bafadsaEUIb2JewYCIMu5JfI5Ak...", "data": { "message": "Firebase Cloud Messaging Topic Message Sample!", } } |
2.
Intergrating Firebase Cloud Messaging
- The
First, Make new Application on Firebase.
- Paste
google-service.json into project's app folder.
- Now,
Open the build.gradle and add some dependencies:
Open app/build.gradle, add
firebase message dependency.
-
Create MyFurebaseInstanceIDService.java under service package.
This class receives the firebase registration_id which will be unique to each
app.
MyFirebaseInstanceIDService.java
|
package info.androidhive.firebasenotifications.service;
import android.content.Intent; import android.content.SharedPreferences; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import com.google.firebase.iid.FirebaseInstanceId; import com.google.firebase.iid.FirebaseInstanceIdService; import info.androidhive.firebasenotifications.app.Config; public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService { private static final String TAG = MyFirebaseInstanceIDService.class.getSimpleName(); @Override public void onTokenRefresh() { super.onTokenRefresh(); String refreshedToken = FirebaseInstanceId.getInstance().getToken(); // Saving reg id to shared preferences storeRegIdInPref(refreshedToken); // sending reg id to your server sendRegistrationToServer(refreshedToken); // Notify UI that registration has completed, so the progress indicator can be hidden. Intent registrationComplete = new Intent(Config.REGISTRATION_COMPLETE); registrationComplete.putExtra("token", refreshedToken); LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete); } private void sendRegistrationToServer(final String token) { // sending gcm token to server Log.e(TAG, "sendRegistrationToServer: " + token); } private void storeRegIdInPref(String token) { SharedPreferences pref = getApplicationContext().getSharedPreferences(Config.SHARED_PREF, 0); SharedPreferences.Editor editor = pref.edit(); editor.putString("regId", token); editor.commit(); } } |
Create
another class MyFirebaseMessagingService.java under service package.
This class receives the firebase messages into onMessageReceived() function.
MyFirebaseMessagingService.java
|
package info.androidhive.firebasenotifications.service;
import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;
import android.text.TextUtils;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
import org.json.JSONException;
import org.json.JSONObject;
import info.androidhive.firebasenotifications.activity.MainActivity;
import info.androidhive.firebasenotifications.app.Config;
import info.androidhive.firebasenotifications.util.NotificationUtils;
public class MyFirebaseMessagingService
extends FirebaseMessagingService
{
private static final String TAG =
MyFirebaseMessagingService.class.getSimpleName();
private NotificationUtils
notificationUtils;
@Override
public void onMessageReceived(RemoteMessage
remoteMessage) {
Log.e(TAG,
"From: " +
remoteMessage.getFrom());
if (remoteMessage == null)
return;
//
Check if message contains a notification payload.
if (remoteMessage.getNotification()
!= null) {
Log.e(TAG,
"Notification Body: " +
remoteMessage.getNotification().getBody());
handleNotification(remoteMessage.getNotification().getBody());
}
//
Check if message contains a data payload.
if (remoteMessage.getData().size()
> 0) {
Log.e(TAG,
"Data Payload: " +
remoteMessage.getData().toString());
try {
JSONObject
json = new JSONObject(remoteMessage.getData().toString());
handleDataMessage(json);
}
catch (Exception e) {
Log.e(TAG,
"Exception: " + e.getMessage());
}
}
}
private void handleNotification(String
message) {
if (!NotificationUtils.isAppIsInBackground(getApplicationContext()))
{
//
app is in foreground, broadcast the push message
Intent
pushNotification = new Intent(Config.PUSH_NOTIFICATION);
pushNotification.putExtra("message",
message);
LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);
//
play notification sound
NotificationUtils
notificationUtils = new NotificationUtils(getApplicationContext());
notificationUtils.playNotificationSound();
}else{
//
If the app is in background, firebase itself handles the notification
}
}
private void handleDataMessage(JSONObject
json) {
Log.e(TAG,
"push json: " + json.toString());
try {
JSONObject
data = json.getJSONObject("data");
String
title = data.getString("title");
String
message = data.getString("message");
boolean isBackground =
data.getBoolean("is_background");
String
imageUrl = data.getString("image");
String
timestamp = data.getString("timestamp");
JSONObject
payload = data.getJSONObject("payload");
Log.e(TAG,
"title: " + title);
Log.e(TAG,
"message: " + message);
Log.e(TAG,
"isBackground: " +
isBackground);
Log.e(TAG,
"payload: " + payload.toString());
Log.e(TAG,
"imageUrl: " + imageUrl);
Log.e(TAG,
"timestamp: " + timestamp);
if (!NotificationUtils.isAppIsInBackground(getApplicationContext()))
{
//
app is in foreground, broadcast the push message
Intent
pushNotification = new Intent(Config.PUSH_NOTIFICATION);
pushNotification.putExtra("message",
message);
LocalBroadcastManager.getInstance(this).sendBroadcast(pushNotification);
//
play notification sound
NotificationUtils
notificationUtils = new NotificationUtils(getApplicationContext());
notificationUtils.playNotificationSound();
}
else {
//
app is in background, show the notification in notification tray
Intent
resultIntent = new Intent(getApplicationContext(),
MainActivity.class);
resultIntent.putExtra("message",
message);
//
check for image attachment
if (TextUtils.isEmpty(imageUrl))
{
showNotificationMessage(getApplicationContext(),
title, message, timestamp, resultIntent);
}
else {
//
image is present, show notification with image
showNotificationMessageWithBigImage(getApplicationContext(),
title, message, timestamp, resultIntent, imageUrl);
}
}
}
catch (JSONException e) {
Log.e(TAG,
"Json Exception: " +
e.getMessage());
}
catch (Exception e) {
Log.e(TAG,
"Exception: " + e.getMessage());
}
}
/**
*
Showing notification with text only
*/
private void showNotificationMessage(Context
context, String title, String message, String timeStamp, Intent intent) {
notificationUtils
= new NotificationUtils(context);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
notificationUtils.showNotificationMessage(title,
message, timeStamp, intent);
}
/**
*
Showing notification with text and image
*/
private void showNotificationMessageWithBigImage(Context
context, String title, String message, String timeStamp, Intent intent,
String imageUrl) {
notificationUtils
= new NotificationUtils(context);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
notificationUtils.showNotificationMessage(title,
message, timeStamp, intent, imageUrl);
}
}
|
Add two
firebase service above into AndroidManifest.xml
AndroidManifest.xml
|
<?xml version="1.0" encoding="utf-8"?>
package="com.conan.firebasenotification">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".activity.MainActivity"
android:label="@string/title_main_activity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--
Firebase Notifications -->
<service android:name=".service.MyFirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".service.MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
<!--
./Firebase Notifications -->
</application>
</manifest>
|
Open class MainActivity.java to
get and show registration id.
MainActivity.java
|
package info.androidhive.firebasenotifications.activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.google.firebase.messaging.FirebaseMessaging;
import info.androidhive.firebasenotifications.R;
import info.androidhive.firebasenotifications.app.Config;
import info.androidhive.firebasenotifications.util.NotificationUtils;
public class MainActivity extends AppCompatActivity {
private static final String TAG =
MainActivity.class.getSimpleName();
private BroadcastReceiver
mRegistrationBroadcastReceiver;
private TextView txtRegId,
txtMessage;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtRegId
= (TextView) findViewById(R.id.txt_reg_id);
txtMessage
= (TextView) findViewById(R.id.txt_push_message);
mRegistrationBroadcastReceiver
= new BroadcastReceiver() {
@Override
public void onReceive(Context
context, Intent intent) {
//
checking for type intent filter
if (intent.getAction().equals(Config.REGISTRATION_COMPLETE))
{
//
gcm successfully registered
//
now subscribe to `global` topic to receive app wide notifications
FirebaseMessaging.getInstance().subscribeToTopic(Config.TOPIC_GLOBAL);
displayFirebaseRegId();
}
else if (intent.getAction().equals(Config.PUSH_NOTIFICATION))
{
//
new push notification is received
String
message = intent.getStringExtra("message");
Toast.makeText(getApplicationContext(),
"Push notification: " + message, Toast.LENGTH_LONG).show();
txtMessage.setText(message);
}
}
};
displayFirebaseRegId();
}
//
Fetches reg id from shared preferences
//
and displays on the screen
private void displayFirebaseRegId() {
SharedPreferences
pref = getApplicationContext().getSharedPreferences(Config.SHARED_PREF, 0);
String
regId = pref.getString("regId", null);
Log.e(TAG,
"Firebase reg id: " +
regId);
if (!TextUtils.isEmpty(regId))
txtRegId.setText("Firebase
Reg Id: " + regId);
else
txtRegId.setText("Firebase
Reg Id is not received yet!");
}
@Override
protected void onResume() {
super.onResume();
//
register GCM registration complete receiver
LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver,
new IntentFilter(Config.REGISTRATION_COMPLETE));
//
register new push message receiver
//
by doing this, the activity will be notified each time a new message arrives
LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver,
new IntentFilter(Config.PUSH_NOTIFICATION));
//
clear the notification area when the app is opened
NotificationUtils.clearNotifications(getApplicationContext());
}
@Override
protected void onPause() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(mRegistrationBroadcastReceiver);
super.onPause();
}
}
|
This is result:
3.
Sending message from Firebase Dashboard
We can
send message from Firebase dashboard. Click "Notification" menu.
4. Sending message from Java Backend
Get API Key from Firebase
0 comments:
Post a Comment