ارسال واستقبال الاشعارات باستخدام Firebase والانتقال الى صفحة معينه بعد ارسال الاشعار في تطوير تطبيقات الاندرويد ستوديو #13

ارسال واستقبال الاشعارات باستخدام Firebase والانتقال الى صفحة معينه بعد ارسال الاشعار في تطوير تطبيقات الاندرويد ستوديو

ارسال واستقبال الاشعارات باستخدام Firebase والانتقال الى صفحة معينه بعد ارسال الاشعار في تطوير تطبيقات الاندرويد ستوديو


في هذا المقال سوف نشرح معكم كيف تقوم بتعيين استقبال للرسائل التي تصل من fcm سواء من topic او حتى من مستخدم عادي في هذا المقال مع امكانية النقر على الاشعار وارسال المستخدم الى اي صفحه وكل هذا سوف يكون من خلال مقالة اليوم وايضا سوف نقوم بتعيين استقبال الرسائل في حالة background وفي حالة forground يكون الوضع مختلف قليلا وكل شيئ سوف نقوم بشرحه لكم في هذه المقاله حتى لا تواجهك اي مشكلة في تنفيذ الاكواد .


بالنسبة لحالة forground فهي تعمل في حالة اذا كان التطبيق مفتوح وقت استقبال الاشعار والكود الذي يوجد في MyFirebaseMessagingService هو ما يتم تنفيذه وفي الطبيعي اذا كان التطبيق مفتوح لا يصل اشعار ولكن يمكنك تنفيذ اي امر ترغب به بدون اي مشاكل بداخل دالة onMessageReceived .


How to use FirebaseMessagingService in your app

لكي تكون قادر على استقبال الاشعارات بدون اي مشاكل عليك بان تقوم بإنشاء class باسم FirebaseMessagingService وهو مخصص لاستقبال الاشعارات وايضا تحديث token اذا حدث له اي تعديل اولا دالة onNewToken وهيا تعمل عندما يتم تحديث التوكن الخاص بالمستخدم وتعمل ايضا في اول مره يعمل بها التطبيق والثانيه وهيا onMessageReceived وهيا تعمل عندما يتم استقبال اي رساله وبها قمنا بطباعة نص الرساله في log وايضا عرض اشعار عندما تصل اي رساله جديده للمستخدم باستخدام دالة  sendNotification .


sendNotification تقوم باستقبال الاشعار ويتم عرضه ايضا تقوم هذه الحالة باستخدام خاصية pendingIntent  وهيا لكي ننقل المستخدم الى اي صفحة نريدها بعد النقر على الاشعار كما هو موضح . مع تعيين خصائص الاشعار الذي يصل مثل الاهتزاز ولون الاشعار وغيره .


How to use FirebaseMessagingService in your app

MyFirebaseMessagingService.java



public class MyFirebaseMessagingService extends FirebaseMessagingService {
    private static final String TAG = "MyFirebaseMsgService";
    String appPackageName;

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Log.d(TAG, "From: " + remoteMessage.getFrom());
        sendNotification(remoteMessage);

        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }
    }
    @Override
    public void onNewToken(@NonNull String token) {
        Log.d(TAG, "Refreshed token: " + token);
    }

    PendingIntent getPendingIntent(String body) {
        Intent intent = new Intent(new Intent(getApplicationContext(), NewApplicationTest.class));
        return PendingIntent.getActivity(this, 0,intent , PendingIntent.FLAG_UPDATE_CURRENT);
    }

    private void sendNotification(RemoteMessage remoteMessage) {

        String title = remoteMessage.getNotification().getTitle();
        String body;

        try {
            body = remoteMessage.getNotification().getBody().split("\\*")[1].replaceAll(" ", "");
        } catch (Exception e) {
            body = remoteMessage.getNotification().getBody();
        }

        Log.i(TAG, "sendNotification: body2 : " + body);
        Log.i(TAG, "sendNotification: bodyApplication : " + body);

        PendingIntent pendingIntent = getPendingIntent(body);


        long[] pattern = {0, 500, 1000, 200, 0};

        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

        String channelId = "fcm_default_channel";
        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        .setContentTitle("FCM Message")
                        .setVibrate(pattern)
                        .setLights(Color.GREEN, 1, 1)
                        .setContentTitle(title)
                        .setContentText("bodddy")
                        .setContentIntent(pendingIntent)
                        .setAutoCancel(true)
                        .setSound(defaultSoundUri)
                        .setSmallIcon(R.drawable.almahmoud)
                        .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(0, notificationBuilder.build());

    }
}


How to change page after send notification


في النهايه عليك بالانتقال الى manifest واضافة الاكواد التاليه بداخله حتى لا يحدث معك اي مشاكل اولا وهيا meta-data وهيا لعمل لون معين للاشعارات وصورة مخصصه .

service وهيا تعمل عندما يصل اي اشعار جديد من الفايربيز لتطبيقك .

اخيرا intent-filter وتضعها عند الصفحة التي تريدها ان تعمل عند وصول الاشعار لها مع تحديد الاسم الخاص بها والاسم يتم ارفاقه من postman واذا تشابه الاسم سوف ينقله لهذه الصفحه بدون مشاكل .


How to change page after send notification

manifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <permission android:name="com.example.gcm.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />
    <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />



    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AlmahmoudAPP"
        android:usesCleartextTraffic="true">


        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/almahmoud" />
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/green_100" />

              
              
        <activity
            android:name=".SplashScreenActivity"
            android:exported="true">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        

                  
                  
        <activity
            android:name=".activitys.settings.NewApplicationTest"
            android:exported="true" >

        <intent-filter>
            <action android:name="YOUR_ACTION" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>

        </activity>


        <service
            android:name=".data.remote.MyFirebaseMessagingService"
            android:directBootAware="true"
            android:exported="true"
            android:enabled="true"
            android:permission="com.google.android.c2dm.permission.SEND"
            tools:targetApi="n">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>


    </application>

</manifest>

كود postman حتى تستطيع تجربة ارسال الاشعارات

{
    "to":"/topics/DM",
    "notification": {
      "title": "Check this Mobile (title)",
      "body": "Rich Notification testing (body)",
      "mutable_content": true,
      "sound": "Tri-tone",
      "click_action": "YOUR_ACTION"
      },

   "data": {
    "url": "https://www.geecoders.com",
    "id_app": "com.almahmoudApp.al_mahmoudapp"
      }
}


فيديو الشرح



تعليقات