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

নোটিফিকেশন বাটন ক্লিক করলে নোটিফিকেশন প্যানেল বন্ধ করা


নোটিফিকেশন অ্যাকশন বাটন থেকে প্যানেল ডিসমিস করা

যখন নোটিফিকেশনে addAction() দিয়ে বাটন যোগ করা হয়, ডিফল্টভাবে সেটি ক্লিক করলে নোটিফিকেশন প্যানেল খোলা থাকে। প্যানেল বন্ধ করার জন্য 해당 `PendingIntent`-কে `BroadcastReceiver`-এ রাউট করে `NotificationManager.cancel()` কল করতে হয়।

ধাপ ১: প্রজেক্ট তৈরি

Android Studio-তে নতুন প্রজেক্ট শুরু করুন।

ধাপ ২: লেআউট

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:app="https://schemas.android.com/apk/res-auto"
    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/btnCreateNotification"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="অ্যাকশন বাটনসহ নোটিফিকেশন"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

ধাপ ৩: BroadcastReceiver তৈরি করুন

src/NotificationActionReceiver.java — এই রিসিভার অ্যাকশন বাটন ক্লিক হ্যান্ডেল করবে এবং নোটিফিকেশন মুছে দেবে।

package com.example.notificationaction;

import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class NotificationActionReceiver extends BroadcastReceiver {
    public static final String ACTION_DISMISS = "com.example.ACTION_DISMISS";
    public static final String EXTRA_NOTIF_ID = "notif_id";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (ACTION_DISMISS.equals(intent.getAction())) {
            int notifId = intent.getIntExtra(EXTRA_NOTIF_ID, -1);
            if (notifId != -1) {
                NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
                if (nm != null) nm.cancel(notifId); // ★ নোটিফিকেশন মুছে ফেলা
            }
            // প্যানেল বন্ধ করার জন্য একটি ব্রডকাস্ট পাঠানো যায় (অপশনাল)
            context.sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
        }
    }
}

ধাপ ৪: MainActivity.java - নোটিফিকেশন বিল্ড করা

package com.example.notificationaction;

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

public class MainActivity extends AppCompatActivity {

    public static final String CHANNEL_ID = "action_channel";
    private static final String DEFAULT_CH = "default";

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

        Button btn = findViewById(R.id.btnCreateNotification);
        btn.setOnClickListener(v -> {
            final int notifId = (int) System.currentTimeMillis();

            // অ্যাকশন বাটনের জন্য PendingIntent (BroadcastReceiver-এ যাবে)
            Intent dismissIntent = new Intent(this, NotificationActionReceiver.class);
            dismissIntent.setAction(NotificationActionReceiver.ACTION_DISMISS);
            dismissIntent.putExtra(NotificationActionReceiver.EXTRA_NOTIF_ID, notifId);
            PendingIntent dismissPendingIntent = PendingIntent.getBroadcast(
                    this, 0, dismissIntent, PendingIntent.FLAG_IMMUTABLE);

            // মূল কন্টেন্ট ইন্টেন্ট (অ্যাপ খোলার জন্য)
            Intent contentIntent = new Intent(this, MainActivity.class);
            contentIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            PendingIntent contentPendingIntent = PendingIntent.getActivity(
                    this, 0, contentIntent, PendingIntent.FLAG_IMMUTABLE);

            NotificationCompat.Builder builder = new NotificationCompat.Builder(this, DEFAULT_CH)
                    .setSmallIcon(R.drawable.ic_launcher_foreground)
                    .setContentTitle("অ্যাকশন বাটনসহ নোটিফিকেশন")
                    .setContentText("নিচের 'বন্ধ করুন' বাটনে চাপুন")
                    .setContentIntent(contentPendingIntent)
                    .addAction(R.drawable.ic_launcher_foreground, "বন্ধ করুন", dismissPendingIntent) // ★ অ্যাকশন বাটন
                    .setAutoCancel(true)
                    .setStyle(new NotificationCompat.BigTextStyle()
                            .bigText("এই নোটিফিকেশনে একটি অ্যাকশন বাটন আছে যা প্যানেল বন্ধ করে দেবে।"));

            NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                NotificationChannel ch = new NotificationChannel(CHANNEL_ID, "অ্যাকশন চ্যানেল", NotificationManager.IMPORTANCE_HIGH);
                builder.setChannelId(CHANNEL_ID);
                if (nm != null) nm.createNotificationChannel(ch);
            }

            if (nm != null) nm.notify(notifId, builder.build());
        });
    }
}

ধাপ ৫: AndroidManifest.xml - রিসিভার রেজিস্টার করুন

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.NotificationAction">

        <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>

        <!-- অ্যাকশন বাটন রিসিভার -->
        <receiver
            android:name=".NotificationActionReceiver"
            android:exported="false" />

    </application>
</manifest>

পরীক্ষা

অ্যাপ রান করুন। নোটিফিকেশন আসবে। এক্সপ্যান্ড করলে "বন্ধ করুন" বাটন দেখাবে। সেটি চাপলে নোটিফিকেশন মুছে যাবে এবং নোটিফিকেশন প্যানেল বন্ধ হয়ে যাবে।

নোটিফিকেশন বাটন ক্লিক করলে নোটিফিকেশন প্যানেল বন্ধ করা

  1. এন্ড্রয়েডে একসাথে সব অ্যাক্টিভিটি বন্ধ করার পদ্ধতি

  2. অ্যান্ড্রয়েডে টেক্সটভিউয়ের লেআউট ওয়েট প্রোগ্রামেটিক্যালি সেট করা

  3. Android-এ Home Button ওভাররাইড/হ্যান্ডল করার পদ্ধতি

  4. অ্যান্ড্রয়েডে বাটনের কোণাবৃত্তাকার কর্নার তৈরি করার পদ্ধতি