কম্পিউটার টিউটোরিয়াল

Android-এ Notification.deleteIntent কীভাবে ব্যবহার করবেন

নোটিফিকেশন ডিলিট ইয়েন্ট (deleteIntent) ব্যবহার গাইড

Notification.deleteIntent হল একটি PendingIntent যা তখন ট্রিগার হয় যখন ব্যবহারকারী নোটিফিকেশনটি ডিসমিস করে (সোয়াইপ করে মুছে দেয় বা "Clear All" চাপে)। এটি ব্যাকগ্রাউন্ডে ক্লিন-আপ কাজ বা অ্যানালিটিক্স ট্র্যাকিং-এর জন্য উপযোগী।

প্রয়োজনীয় কম্পোনেন্ট

  • NotificationCompat.Builder
  • PendingIntent (getBroadcast)
  • BroadcastReceiver (delete event হ্যান্ডেল করার জন্য)
  • Notification Channel (API 26+)

ধাপ ১: প্রজেক্ট সেটআপ

Android Studio-তে নতুন "Empty Activity" প্রজেক্ট তৈরি করুন: DeleteIntentDemo।

ধাপ ২: লেআউট (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnNotify"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:onClick="createNotification"
        android:text="নোটিফিকেশন দেখান" />

</RelativeLayout>

ধাপ ৩: MainActivity.java

package com.example.deleteintentdemo;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;

public class MainActivity extends AppCompatActivity {

    public static final String CHANNEL_ID = "delete_intent_channel";
    private static final String DEFAULT_CHANNEL = "default";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void createNotification(View view) {
        Intent notificationIntent = new Intent(this, MainActivity.class);
        notificationIntent.putExtra("fromNotification", true);
        notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);

        PendingIntent contentPendingIntent = PendingIntent.getActivity(
                this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE);

        // Delete Intent: নোটিফিকেশন ডিসমিস হলে ট্রিগার হবে
        PendingIntent deletePendingIntent = getDeleteIntent();

        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, DEFAULT_CHANNEL)
                .setContentTitle("ডিলিট ইয়েন্ট ডেমো")
                .setContentText("নোটিফিকেশন ডিসমিস করলে টোস্ট দেখাবে")
                .setSmallIcon(R.drawable.ic_launcher_foreground)
                .setContentIntent(contentPendingIntent)
                .setDeleteIntent(deletePendingIntent)  // কী সেটিং
                .setAutoCancel(true);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    CHANNEL_ID, "ডিলিট ইয়েন্ট চ্যানেল", 
                    NotificationManager.IMPORTANCE_HIGH);
            manager.createNotificationChannel(channel);
            builder.setChannelId(CHANNEL_ID);
        }

        manager.notify((int) System.currentTimeMillis(), builder.build());
    }

    private PendingIntent getDeleteIntent() {
        Intent intent = new Intent(this, NotificationDeleteReceiver.class);
        intent.setAction("notification_cancelled");
        return PendingIntent.getBroadcast(this, 0, intent, 
                PendingIntent.FLAG_CANCEL_CURRENT | PendingIntent.FLAG_IMMUTABLE);
    }
}

ধাপ ৪: BroadcastReceiver (NotificationDeleteReceiver.java)

package com.example.deleteintentdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class NotificationDeleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if ("notification_cancelled".equals(action)) {
            Toast.makeText(context, "নোটিফিকেশন সরানো হয়েছে", Toast.LENGTH_SHORT).show();
            // এখানে আপনি করতে পারেন:
            // - লোকাল ডাটাবেস আপডেট
            // - সার্ভারে ইভেন্ট পাঠানো
            // - শেয়ার্ড প্রিফারেন্সেজ আপডেট
        }
    }
}

ধাপ ৫: Manifest এ রেজিস্ট্রেশন

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="com.example.deleteintentdemo">

    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <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.DeleteIntentDemo">

        <receiver
            android:name=".NotificationDeleteReceiver"
            android:enabled="true"
            android:exported="true" />

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

দরকারী নোট: setAutoCancel(true) এর প্রভাব

setAutoCancel(true) সেট থাকলে, নোটিফিকেশনে ট্যাপ করলেও ডিসমিস হয় এবং deleteIntent ফায়ার হয়। যদি শুধু সোয়াইপ বা "Clear All" দিলে ট্রিগার করতে চান, তবে setAutoCancel(false) রাখুন এবং ContentIntent-এ নিজে cancel লজিক যোগ করুন।

ব্যবহার ক্ষেত্র (Use Cases)

  • অ্যাপ-ইন-বক্স মেসেজ পড়া হয়নি এমনকি ডিসমিস করলে সার্ভারে রিপোর্ট পাঠানো
  • লোকাল ক্যাশে বা ডাটাবেস ক্লিন-আপ
  • ব্যবহারকারীর ইন্টারঅ্যাকশন অ্যানালিটিক্স
  • "Do Not Disturb" মোড আপডেট করা

সাধারণ ভুল ও সমাধান

সমস্যাসমাধান
deleteIntent কল হয় নাReceiver exported=true, PendingIntent-এ FLAG_IMMUTABLE আছে কিনা চেক করুন
দুইবার কল হচ্ছেFLAG_CANCEL_CURRENT ব্যবহার করুন, duplicate receiver register ন করুন
Toast দেখাচ্ছে নাReceiver-এ Context থেকে Toast.makeText(...) করুন, UI thread-এ নিশ্চিত হন

পরীক্ষা পদ্ধতি

  1. অ্যাপ চালু করুন → "নোটিফিকেশন দেখান" চাপুন
  2. নোটিফিকেশন প্যানেল খুলুন
  3. নোটিফিকেশনটি ডান/বামে সোয়াইপ করুন অথবা "Clear All" চাপুন
  4. স্ক্রিনে "নোটিফিকেশন সরানো হয়েছে" টোস্ট দেখতে পাবেন
  1. অ্যান্ড্রয়েডে নোটিফিকেশন InboxStyle ব্যবহার করার পদ্ধতি

  2. এন্ড্রয়েডে ViewFlipper ব্যবহার করার পদ্ধতি

  3. অ্যান্ড্রয়েডে Snackbar ব্যবহার করার পদ্ধতি

  4. Android-এ NavigationView ব্যবহার করে নেভিগেশন ড্রয়ার তৈরির পদ্ধতি