जुलाई 2019 तक कार्य करना
Android compileSdkVersion 28, buildToolsVersion 28.0.3 और फायरबेस-मैसेजिंग: 19.0.1
अन्य सभी स्टैकऑवरफ्लो प्रश्नों और उत्तरों के माध्यम से कई घंटों के शोध के बाद, और असंख्य आउटडेटेड समाधानों को आज़माने के बाद, यह समाधान इन 3 परिदृश्यों में सूचनाएँ दिखाने में कामयाब रहा:
- ऐप अग्रभूमि में है:
सूचना MyMirebaseMessagingService वर्ग पर onMessageReceived विधि द्वारा प्राप्त की गई है
- ऐप को मार दिया गया है (यह पृष्ठभूमि में नहीं चल रहा है):
एफसीएम द्वारा अधिसूचना स्वचालित रूप से अधिसूचना ट्रे को भेजी जाती है। जब उपयोगकर्ता अधिसूचना को छूता है, तो ऐप उस गतिविधि को कॉल करके लॉन्च किया जाता है जिसमें प्रकट में android.intent.category.LAUNCHER है। आप getIntent ()। GetExtras () onCreate () पद्धति का उपयोग करके अधिसूचना का डेटा भाग प्राप्त कर सकते हैं।
- ऐप पृष्ठभूमि में है:
अधिसूचना एफसीएम द्वारा स्वचालित रूप से अधिसूचना ट्रे को भेजी जाती है। जब उपयोगकर्ता अधिसूचना को छूता है, तो ऐप को गतिविधि में लॉन्च करके अग्रभूमि में लाया जाता है जिसमें प्रकट में android.intent.category.LAUNCHER है। जैसा कि मेरे ऐप ने लॉन्च किया है, उस गतिविधि में "एकल" को लॉन्च किया है, ऑनक्रिएट () विधि को नहीं कहा जाता है क्योंकि उसी वर्ग की एक गतिविधि पहले से ही बनाई गई है, इसके बजाय उस कक्षा का ऑन-एंटेंट () विधि कहा जाता है और आपको डेटा का हिस्सा मिलता है अभिप्रेरणा .getExtras () का उपयोग करके वहां सूचना।
चरण: 1- यदि आप अपने ऐप की मुख्य गतिविधि को इस तरह परिभाषित करते हैं:
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:largeHeap="true"
android:screenOrientation="portrait"
android:launchMode="singleTop">
<intent-filter>
<action android:name=".MainActivity" />
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
2- अपने मेनऐक्टिविटी.क्लास की ऑनक्रिएट () विधि में इन पंक्तियों को जोड़ें
Intent i = getIntent();
Bundle extras = i.getExtras();
if (extras != null) {
for (String key : extras.keySet()) {
Object value = extras.get(key);
Log.d(Application.APPTAG, "Extras received at onCreate: Key: " + key + " Value: " + value);
}
String title = extras.getString("title");
String message = extras.getString("body");
if (message!=null && message.length()>0) {
getIntent().removeExtra("body");
showNotificationInADialog(title, message);
}
}
और एक ही MainActivity.class करने के लिए ये तरीके:
@Override
public void onNewIntent(Intent intent){
//called when a new intent for this class is created.
// The main case is when the app was in background, a notification arrives to the tray, and the user touches the notification
super.onNewIntent(intent);
Log.d(Application.APPTAG, "onNewIntent - starting");
Bundle extras = intent.getExtras();
if (extras != null) {
for (String key : extras.keySet()) {
Object value = extras.get(key);
Log.d(Application.APPTAG, "Extras received at onNewIntent: Key: " + key + " Value: " + value);
}
String title = extras.getString("title");
String message = extras.getString("body");
if (message!=null && message.length()>0) {
getIntent().removeExtra("body");
showNotificationInADialog(title, message);
}
}
}
private void showNotificationInADialog(String title, String message) {
// show a dialog with the provided title and message
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(title);
builder.setMessage(message);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
3- इस तरह से MyFirebase क्लास बनाएं:
package com.yourcompany.app;
import android.content.Intent;
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class MyFirebaseMessagingService extends FirebaseMessagingService {
public MyFirebaseMessagingService() {
super();
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(Application.APPTAG, "myFirebaseMessagingService - onMessageReceived - message: " + remoteMessage);
Intent dialogIntent = new Intent(this, NotificationActivity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
dialogIntent.putExtra("msg", remoteMessage);
startActivity(dialogIntent);
}
}
4- इस तरह एक नया वर्ग NotificationActivity.class बनाएं:
package com.yourcompany.app;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.view.ContextThemeWrapper;
import com.google.firebase.messaging.RemoteMessage;
public class NotificationActivity extends AppCompatActivity {
private Activity context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = this;
Bundle extras = getIntent().getExtras();
Log.d(Application.APPTAG, "NotificationActivity - onCreate - extras: " + extras);
if (extras == null) {
context.finish();
return;
}
RemoteMessage msg = (RemoteMessage) extras.get("msg");
if (msg == null) {
context.finish();
return;
}
RemoteMessage.Notification notification = msg.getNotification();
if (notification == null) {
context.finish();
return;
}
String dialogMessage;
try {
dialogMessage = notification.getBody();
} catch (Exception e){
context.finish();
return;
}
String dialogTitle = notification.getTitle();
if (dialogTitle == null || dialogTitle.length() == 0) {
dialogTitle = "";
}
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(context, R.style.myDialog));
builder.setTitle(dialogTitle);
builder.setMessage(dialogMessage);
builder.setPositiveButton(getResources().getString(R.string.accept), new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
}
5- इन पंक्तियों को अपने टैग्स के अंदर, अपने ऐप मेनिफेस्ट में जोड़ें
<service
android:name=".MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id"/>
<activity android:name=".NotificationActivity"
android:theme="@style/myDialog"> </activity>
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/notification_icon"/>
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/color_accent" />
6- इन पंक्तियों को अपने Application.java onCreate () विधि में, या MainActivity.class onCreate () विधि में जोड़ें:
// notifications channel creation
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Create channel to show notifications.
String channelId = getResources().getString("default_channel_id");
String channelName = getResources().getString("General announcements");
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(new NotificationChannel(channelId,
channelName, NotificationManager.IMPORTANCE_LOW));
}
किया हुआ।
अब इसके लिए 3 उल्लिखित परिदृश्यों में अच्छी तरह से काम करने के लिए, आपको निम्नलिखित तरीके से फायरबेस वेब कंसोल से अधिसूचना भेजनी होगी:
अधिसूचना अनुभाग में: अधिसूचना शीर्षक = अधिसूचना संवाद में प्रदर्शित करने के लिए शीर्षक (वैकल्पिक) अधिसूचना पाठ = उपयोगकर्ता को दिखाने के लिए संदेश (आवश्यक) फिर लक्ष्य अनुभाग में: ऐप = आपका एंड्रॉइड ऐप और अतिरिक्त विकल्प अनुभाग में: Android अधिसूचना चैनल = default_channel_id कस्टम डेटा कुंजी: शीर्षक मान: (अधिसूचना अनुभाग के शीर्षक क्षेत्र की तुलना में यहाँ एक ही पाठ) कुंजी: शरीर का मूल्य: (अधिसूचना अनुभाग के संदेश क्षेत्र की तुलना में यहाँ एक ही पाठ) कुंजी: click_action मान: .MainActivity ध्वनि। = विकलांग की
समाप्ति = 4 सप्ताह
आप Google Play के साथ एपीआई 28 के साथ एमुलेटर में इसे डिबग कर सकते हैं।
हैप्पी कोडिंग!
Not getting messages here? See why this may be: goo.gl/39bRNJ
। नीचे दिए गए उत्तरों की तरह इसका समाधान