একটি Android অ্যাপে বার্তা গ্রহণ করুন

ফায়ারবেস বিজ্ঞপ্তিগুলি প্রাপক অ্যাপের অগ্রভাগ/পটভূমির অবস্থার উপর নির্ভর করে ভিন্নভাবে আচরণ করে। আপনি যদি ফোরগ্রাউন্ডেড অ্যাপগুলি বিজ্ঞপ্তি বার্তা বা ডেটা বার্তা পেতে চান, তাহলে আপনাকে onMessageReceived কলব্যাক পরিচালনা করতে কোড লিখতে হবে। বিজ্ঞপ্তি এবং ডেটা বার্তাগুলির মধ্যে পার্থক্যের ব্যাখ্যার জন্য, বার্তার প্রকারগুলি দেখুন৷

বার্তা হ্যান্ডলিং

বার্তাগুলি পেতে, FirebaseMessagingService প্রসারিত করে এমন একটি পরিষেবা ব্যবহার করুন৷ আপনার পরিষেবা onMessageReceived এবং onDeletedMessages কলব্যাকগুলিকে ওভাররাইড করা উচিত৷ এটি প্রাপ্তির 20 সেকেন্ডের মধ্যে (অ্যান্ড্রয়েড মার্শম্যালোতে 10 সেকেন্ড) যেকোনো বার্তা পরিচালনা করবে। onMessageReceived -এ কল করার আগে OS বিলম্বের উপর নির্ভর করে সময় উইন্ডোটি ছোট হতে পারে। সেই সময়ের পরে, বিভিন্ন OS আচরণ যেমন Android O-এর ব্যাকগ্রাউন্ড এক্সিকিউশন লিমিট আপনার কাজ সম্পূর্ণ করার ক্ষমতায় হস্তক্ষেপ করতে পারে। আরও তথ্যের জন্য বার্তা অগ্রাধিকার সম্পর্কে আমাদের ওভারভিউ দেখুন।

onMessageReceived নিম্নলিখিত ব্যতিক্রমগুলি সহ বেশিরভাগ বার্তা প্রকারের জন্য প্রদান করা হয়:

  • আপনার অ্যাপ ব্যাকগ্রাউন্ডে থাকলে বিজ্ঞপ্তি বার্তা পাঠানো হয় । এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে বিতরণ করা হয়। একটি বিজ্ঞপ্তিতে ব্যবহারকারীর ট্যাপ ডিফল্টরূপে অ্যাপ লঞ্চার খোলে।

  • বিজ্ঞপ্তি এবং ডেটা পেলোড উভয় সহ বার্তা, যখন পটভূমিতে প্রাপ্ত হয় । এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে বিতরণ করা হয় এবং ডেটা পেলোড আপনার লঞ্চার কার্যকলাপের অভিপ্রায়ের অতিরিক্ত হিসাবে বিতরণ করা হয়।

সংক্ষেপে:

অ্যাপের অবস্থা বিজ্ঞপ্তি ডেটা উভয়
ফোরগ্রাউন্ড onMessageReceived onMessageReceived onMessageReceived
পটভূমি সিস্টেম ট্রে onMessageReceived বিজ্ঞপ্তি: সিস্টেম ট্রে
তথ্য: অভিপ্রায় অতিরিক্ত.
বার্তার ধরন সম্পর্কে আরও তথ্যের জন্য, বিজ্ঞপ্তি এবং ডেটা বার্তা দেখুন।

অ্যাপ ম্যানিফেস্ট সম্পাদনা করুন

FirebaseMessagingService ব্যবহার করতে, আপনাকে আপনার অ্যাপ ম্যানিফেস্টে নিম্নলিখিত যোগ করতে হবে:

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

এছাড়াও, বিজ্ঞপ্তিগুলির উপস্থিতি কাস্টমাইজ করতে আপনাকে ডিফল্ট মান সেট করার পরামর্শ দেওয়া হচ্ছে৷ আপনি একটি কাস্টম ডিফল্ট আইকন এবং একটি কাস্টম ডিফল্ট রঙ নির্দিষ্ট করতে পারেন যা যখনই বিজ্ঞপ্তি পেলোডে সমতুল্য মান সেট না করা হয় তখন প্রয়োগ করা হয়৷

কাস্টম ডিফল্ট আইকন এবং কাস্টম রঙ সেট করতে application ট্যাগের ভিতরে এই লাইনগুলি যোগ করুন:

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

Android এর জন্য কাস্টম ডিফল্ট আইকন প্রদর্শন করে

  • বিজ্ঞপ্তি কম্পোজার থেকে পাঠানো সমস্ত বিজ্ঞপ্তি বার্তা।
  • কোনো বিজ্ঞপ্তি বার্তা যা স্পষ্টভাবে বিজ্ঞপ্তি পেলোডে আইকন সেট করে না।

অ্যান্ড্রয়েড এর জন্য কাস্টম ডিফল্ট রঙ ব্যবহার করে

  • বিজ্ঞপ্তি কম্পোজার থেকে পাঠানো সমস্ত বিজ্ঞপ্তি বার্তা।
  • কোনো বিজ্ঞপ্তি বার্তা যা স্পষ্টভাবে বিজ্ঞপ্তি পেলোডে রঙ সেট করে না।

যদি কোনো কাস্টম ডিফল্ট আইকন সেট করা না থাকে এবং বিজ্ঞপ্তি পেলোডে কোনো আইকন সেট করা না থাকে, তাহলে Android সাদা রঙে রেন্ডার করা অ্যাপ্লিকেশন আইকন প্রদর্শন করে।

ওভাররাইড onMessageReceived

FirebaseMessagingService.onMessageReceived পদ্ধতিটি ওভাররাইড করে, আপনি প্রাপ্ত RemoteMessage অবজেক্টের উপর ভিত্তি করে ক্রিয়া সম্পাদন করতে পারেন এবং বার্তা ডেটা পেতে পারেন:

জাভা

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // ...

    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    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 WorkManager.
            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());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

কোটলিন+কেটিএক্স

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    // ...

    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: ${remoteMessage.from}")

    // Check if message contains a data payload.
    if (remoteMessage.data.isNotEmpty()) {
        Log.d(TAG, "Message data payload: ${remoteMessage.data}")

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

onDeletedMessages ওভাররাইড করুন

কিছু পরিস্থিতিতে, FCM একটি বার্তা প্রদান করতে পারে না। এটি তখন ঘটে যখন একটি নির্দিষ্ট ডিভাইসে আপনার অ্যাপের জন্য অনেক বেশি বার্তা (>100) মুলতুবি থাকে যখন এটি সংযুক্ত হয় বা ডিভাইসটি এক মাসের বেশি সময় ধরে FCM-এর সাথে সংযুক্ত না হয়। এই ক্ষেত্রে, আপনি FirebaseMessagingService.onDeletedMessages() এ একটি কলব্যাক পেতে পারেন যখন অ্যাপ ইনস্ট্যান্স এই কলব্যাকটি পায়, তখন এটি আপনার অ্যাপ সার্ভারের সাথে একটি সম্পূর্ণ সিঙ্ক সঞ্চালন করবে। আপনি যদি গত 4 সপ্তাহের মধ্যে সেই ডিভাইসে অ্যাপটিতে একটি বার্তা না পাঠিয়ে থাকেন, তাহলে FCM-এ কল করবে না onDeletedMessages()

একটি ব্যাকগ্রাউন্ড অ্যাপে বিজ্ঞপ্তি বার্তা পরিচালনা করুন

যখন আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকে, তখন Android সিস্টেম ট্রেতে বিজ্ঞপ্তি বার্তা পাঠায়। বিজ্ঞপ্তিতে একটি ব্যবহারকারীর ট্যাপ ডিফল্টরূপে অ্যাপ লঞ্চারটি খোলে।

এতে বিজ্ঞপ্তি এবং ডেটা পেলোড উভয়ই রয়েছে এমন বার্তাগুলি (এবং বিজ্ঞপ্তি কনসোল থেকে পাঠানো সমস্ত বার্তা) অন্তর্ভুক্ত৷ এই ক্ষেত্রে, বিজ্ঞপ্তিটি ডিভাইসের সিস্টেম ট্রেতে বিতরণ করা হয় এবং ডেটা পেলোড আপনার লঞ্চার কার্যকলাপের অভিপ্রায়ের অতিরিক্ত হিসাবে বিতরণ করা হয়।

আপনার অ্যাপে মেসেজ ডেলিভারির অন্তর্দৃষ্টির জন্য, FCM রিপোর্টিং ড্যাশবোর্ড দেখুন, যা Android অ্যাপের জন্য "ইমপ্রেশন" (ব্যবহারকারীদের দ্বারা দেখা বিজ্ঞপ্তি) ডেটা সহ Apple এবং Android ডিভাইসে পাঠানো এবং খোলা বার্তাগুলির সংখ্যা রেকর্ড করে৷

ব্যাকগ্রাউন্ড সীমাবদ্ধ অ্যাপ (Android P বা নতুন)

FCM ব্যবহারকারীর দ্বারা ব্যাকগ্রাউন্ড সীমাবদ্ধতার মধ্যে রাখা অ্যাপগুলিতে বার্তা সরবরাহ করতে পারে না (যেমন: সেটিং -> অ্যাপস এবং বিজ্ঞপ্তি -> [অ্যাপনাম] -> ব্যাটারি)। একবার আপনার অ্যাপটি ব্যাকগ্রাউন্ড সীমাবদ্ধতা থেকে সরানো হলে, অ্যাপে নতুন বার্তাগুলি আগের মতোই বিতরণ করা হবে। হারিয়ে যাওয়া বার্তা এবং অন্যান্য ব্যাকগ্রাউন্ড সীমাবদ্ধতার প্রভাব প্রতিরোধ করার জন্য, Android অত্যাবশ্যক প্রচেষ্টা দ্বারা তালিকাভুক্ত খারাপ আচরণ এড়াতে ভুলবেন না। এই আচরণগুলি আপনার অ্যাপটিকে ব্যাকগ্রাউন্ডে সীমাবদ্ধ রাখার জন্য ব্যবহারকারীকে সুপারিশ করে Android ডিভাইসের দিকে নিয়ে যেতে পারে। আপনার অ্যাপটি ব্যবহার করে ব্যাকগ্রাউন্ড সীমাবদ্ধ কিনা তা পরীক্ষা করতে পারে: isBackgroundRestricted()

সরাসরি বুট মোডে FCM বার্তা গ্রহণ করুন

ডেভেলপাররা যারা ডিভাইসটি আনলক হওয়ার আগেই অ্যাপগুলিতে FCM বার্তা পাঠাতে চান তারা ডিভাইসটি সরাসরি বুট মোডে থাকা অবস্থায় একটি Android অ্যাপকে বার্তা পেতে সক্ষম করতে পারেন। উদাহরণস্বরূপ, আপনি আপনার অ্যাপের ব্যবহারকারীরা এমনকি একটি লক করা ডিভাইসেও অ্যালার্ম বিজ্ঞপ্তি পেতে চাইতে পারেন।

এই ব্যবহারের ক্ষেত্রে তৈরি করার সময়, সরাসরি বুট মোডের জন্য সাধারণ সর্বোত্তম অনুশীলন এবং বিধিনিষেধগুলি পর্যবেক্ষণ করুন। সরাসরি বুট-সক্ষম বার্তাগুলির দৃশ্যমানতা বিবেচনা করা বিশেষভাবে গুরুত্বপূর্ণ; ডিভাইসে অ্যাক্সেস সহ যেকোনো ব্যবহারকারী ব্যবহারকারীর শংসাপত্র প্রবেশ না করেই এই বার্তাগুলি দেখতে পারেন।

পূর্বশর্ত

  • ডিভাইসটি সরাসরি বুট মোডের জন্য সেট আপ করা আবশ্যক।
  • ডিভাইসটিতে অবশ্যই Google Play পরিষেবাগুলির একটি সাম্প্রতিক সংস্করণ ইনস্টল থাকতে হবে (19.0.54 বা তার পরে)।
  • FCM বার্তাগুলি পেতে অ্যাপটিকে অবশ্যই FCM SDK ( com.google.firebase:firebase-messaging ) ব্যবহার করতে হবে৷

আপনার অ্যাপে সরাসরি বুট মোড বার্তা পরিচালনা সক্ষম করুন

  1. অ্যাপ-লেভেল গ্রেডল ফাইলে, FCM ডাইরেক্ট বুট সাপোর্ট লাইব্রেরির উপর নির্ভরতা যোগ করুন:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. অ্যাপ ম্যানিফেস্টে android:directBootAware="true" অ্যাট্রিবিউট যোগ করে অ্যাপটির FirebaseMessagingService ডাইরেক্ট বুট সচেতন করুন:

    <service
        android:name=".java.MyFirebaseMessagingService"
        android:exported="false"
        android:directBootAware="true">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>
    

এই FirebaseMessagingService সরাসরি বুট মোডে চলতে পারে তা নিশ্চিত করা গুরুত্বপূর্ণ। নিম্নলিখিত প্রয়োজনীয়তা জন্য পরীক্ষা করুন:

  • ডাইরেক্ট বুট মোডে চলাকালীন পরিষেবাটি শংসাপত্র সুরক্ষিত স্টোরেজ অ্যাক্সেস করা উচিত নয়।
  • পরিষেবাটির উপাদানগুলি ব্যবহার করার চেষ্টা করা উচিত নয়, যেমন Activities , BroadcastReceivers , বা অন্য Services যা সরাসরি বুট মোডে চলাকালীন সরাসরি বুট সচেতন হিসাবে চিহ্নিত করা হয় না৷
  • পরিষেবা ব্যবহার করে এমন কোনও লাইব্রেরিগুলিকে অবশ্যই শংসাপত্রের সুরক্ষিত স্টোরেজ অ্যাক্সেস করতে হবে না বা ডাইরেক্ট বুট মোডে চলাকালীন অ-ডাইরেক্ট বুটআওয়ার উপাদানগুলিকে কল করতে হবে না। এর মানে হল যে অ্যাপটি ব্যবহার করে এমন যেকোন লাইব্রেরিগুলিকে পরিষেবা থেকে কল করা হয় সরাসরি বুট সচেতন হতে হবে, অথবা অ্যাপটিকে সরাসরি বুট মোডে চলছে কিনা তা পরীক্ষা করতে হবে এবং সেগুলিকে সেই মোডে কল করতে হবে না। উদাহরণস্বরূপ, Firebase SDK গুলি সরাসরি বুটের সাথে কাজ করে (এগুলি সরাসরি বুট মোডে ক্র্যাশ না করে একটি অ্যাপে অন্তর্ভুক্ত করা যেতে পারে), কিন্তু অনেক Firebase API সরাসরি বুট মোডে কল করা সমর্থন করে না।
  • যদি অ্যাপটি একটি কাস্টম Application ব্যবহার করে, তবে Application সরাসরি বুট সচেতন হতে হবে (সরাসরি বুট মোডে শংসাপত্র সুরক্ষিত স্টোরেজে কোনও অ্যাক্সেস নেই)।

ডাইরেক্ট বুট মোডে ডিভাইসে বার্তা পাঠানোর বিষয়ে নির্দেশনার জন্য, সরাসরি বুট-সক্ষম বার্তা পাঠান দেখুন।