ক্রিয়া ক্লিক করার পরে কীভাবে বিজ্ঞপ্তিটি খারিজ করবেন


142

এপিআই স্তরের 16 (জেলি বিন), এর সাথে একটি বিজ্ঞপ্তিতে ক্রিয়া যুক্ত করার সম্ভাবনা রয়েছে

builder.addAction(iconId, title, intent);

কিন্তু যখন আমি কোনও বিজ্ঞপ্তিতে কোনও ক্রিয়া যুক্ত করি এবং ক্রিয়াটি চাপিত হয়, বিজ্ঞপ্তিটি খারিজ হইবে না। বিজ্ঞপ্তিটি নিজেই ক্লিক করা হচ্ছে, এটি দিয়ে বরখাস্ত করা যেতে পারে

notification.flags = Notification.FLAG_AUTO_CANCEL;

অথবা

builder.setAutoCancel(true);

তবে স্পষ্টতই, বিজ্ঞপ্তির সাথে জড়িত ক্রিয়াগুলির সাথে এর কোনও মিল নেই।

কোন ইঙ্গিত? বা এটি এখনও এপিআইয়ের অংশ নয়? আমি কিছুই পেলাম না।

উত্তর:


154

আপনি যখন নোটিফিকেশন ম্যানেজারকে নোটিফিকেশন বলেছিলেন তখন আপনি এটিকে একটি আইডি দিয়েছেন - এটি সেই অনন্য আইডি যা আপনি পরে এটি অ্যাক্সেস করতে ব্যবহার করতে পারেন (এটি নোটিফিকেশন ম্যানেজারের থেকে:

notify(int id, Notification notification)

বাতিল করতে, আপনি কল করবেন:

cancel(int id)

একই আইডি সহ সুতরাং, মূলত, আপনার আইডিটি ট্র্যাক রাখা বা সম্ভবত একটি प्रलंबित বান্ডলে আইডিটি রাখা উচিত যা আপনি प्रलंबित ইনটেন্টের ভিতরে ইন্টেন্টে যুক্ত করেন?


25
ধন্যবাদ, এটি আমার সমস্যার সমাধান করেছে। যাইহোক, আমি এখনও এটি কিছুটা অতিরিক্ত জটিল বলে মনে করি। কোনও অ্যাকশন চাপলে প্রজ্ঞাপনটি স্বয়ংক্রিয়ভাবে বরখাস্ত করার জন্য একটি এপিআই সরবরাহ করার পরিবর্তে, এটি অর্জনের জন্য আপনাকে উদ্দেশ্য এবং নোটিফিকেশন আইডিতে পাসিং সহ কাজ করতে হবে।
এন্ডোওজনার

2
আপনি যদি মনে করেন এটি জটিল, কোনও বিজ্ঞপ্তি আপডেট করার দিকে লক্ষ্য করবেন না (সেই আইডির ট্র্যাকটি হারাবেন না), বা এটি প্রদর্শিত হয়েছে কি না তা পরীক্ষা করুন (এপিআই এটি ট্র্যাক করে না, আপনাকে করতে হবে) ...: পি
ট্র্যাভিস

2
@ দক্ষিণ: মূলত, আপনি নিজের অভিপ্রায় বিজ্ঞপ্তি ট্যাগ এবং আইডি যুক্ত করেন যা আপনার ক্রিয়াটি চাপলে শুরু হয়। সেই অতিরিক্ত তথ্যের সাহায্যে আপনি সূচনা ক্রিয়াকলাপের মাধ্যমে এটি শুরু হয়েছিল কিনা তা শুরু করার কার্যকলাপটি পরীক্ষা করতে পারেন।
এন্ডোওজনার

5
OnCreate () থেকে কোড নমুনা: বান্ডিল অতিরিক্তগুলি = getIntent ()। GetExtras (); যদি (অতিরিক্ত! = নাল) {স্ট্রিং ট্যাগ = এক্সট্রা.সেটস্ট্রিং (বিজ্ঞপ্তিপ্রাপ্তি ININTENT_EXTRA_NOTIFICATION_TAG); int id = extras.getInt (NotificationsReceiver.INTENT_EXTRA_NOTIFICATION_ID); if (নোটিফিকেশন রিসিভার। NOTIFICATION_ID == আইডি এবং & বিজ্ঞপ্তিপ্রাপ্তি manager.cancel (ট্যাগ, আইডি); }}
এন্ডওজোনার

1
নতুন এপিআইতে আপনি বিজ্ঞপ্তি দিয়েছেন (স্ট্রিং ট্যাগ, ইন্ট আইডি, বিজ্ঞপ্তি বিজ্ঞপ্তি) এবং একইভাবে বাতিল করেছেন (স্ট্রিং ট্যাগ,
ইন্ট

64

ললিপপের হেডস আপ প্রদর্শন বিজ্ঞপ্তি ব্যবহার করার সময় এটি কোনও সমস্যা হিসাবে দেখা গেছে। নকশা নির্দেশিকা দেখুন । বাস্তবায়নের জন্য এখানে সম্পূর্ণ (ইশ) কোড রয়েছে's

এখন অবধি 'খারিজ' বোতাম থাকা কম গুরুত্বপূর্ণ ছিল না, তবে এখন এটি আপনার মুখে আরও বেশি।

শীর্ষস্থানীয় বিজ্ঞপ্তি

নোটিফিকেশন বিল্ডিং

int notificationId = new Random().nextInt(); // just use a counter in some util class...
PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style
        .setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission
        .setSmallIcon(R.drawable.ic_action_refresh) // Required!
        .setContentTitle("Message from test")
        .setContentText("message")
        .setAutoCancel(true)
        .addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent)
        .addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent);

// Gets an instance of the NotificationManager service
NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

// Builds the notification and issues it.
notifyMgr.notify(notificationId, builder.build());

NotificationActivity

public class NotificationActivity extends Activity {

    public static final String NOTIFICATION_ID = "NOTIFICATION_ID";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1));
        finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately
    }

    public static PendingIntent getDismissIntent(int notificationId, Context context) {
        Intent intent = new Intent(context, NotificationActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.putExtra(NOTIFICATION_ID, notificationId);
        PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        return dismissIntent;
    }

}

অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল (ব্যাক স্ট্যাকের দিকে দৃষ্টি নিবদ্ধ করা থেকে SystemUI রোধ করার জন্য প্রয়োজনীয় বৈশিষ্ট্যগুলি)

<activity
    android:name=".NotificationActivity"
    android:taskAffinity=""
    android:excludeFromRecents="true">
</activity>

আমার কাছে একটি অ্যাপ্লিকেশন থেকে একাধিক বিজ্ঞপ্তি রয়েছে এবং বিজ্ঞপ্তিটি চলমান বিজ্ঞপ্তিতে সেট করা আছে। সংযোজন পার্টিকুলার নোটিফিকেশনে সম্পাদন করার সময় আমি বিজ্ঞপ্তিটি সাফ করতে চাই
প্রসাদ

3
পরিবর্তে বিজ্ঞপ্তিটি বরখাস্ত করার জন্য কি এখানে ব্রডকাস্টার্সিভার ব্যবহার করা আরও কার্যকর হবে না? এখানে একটি ভাল উদাহরণ যে শো বাস্তবায়ন, কিন্তু এটা এমনকি আরও কমে যেতে পারে: stackoverflow.com/a/19745745/793150
alice.harrison

1
সমাধানগুলি কাজ করে, অতিরিক্ত সেট বাদে উদ্দেশ্য সহ প্রেরণ করা হয়। সেগুলি অনক্রিটে ফরোয়ার্ড করা হয় না। একটি উপায় হ'ল স্থির ভেরিয়েবল ব্যবহার করা use কেউ কি জানেন, উদ্দেশ্যগুলি অতিরিক্ত কেন পাঠানো হয় না?
বাসচি

গেটডিজিসআইন্টেন্টটি শুধুমাত্র নোটিফিকেশনঅ্যাক্টিভিটিতে রাখলে কেন কাজ করে? মুলতুবি ইনটেন্ট তৈরির কোডটি বিজ্ঞপ্তি নির্মাতা শ্রেণিতে স্থাপন করা হলে বরখাস্ত ইন্টেন্ট কাজ করে না। আমি এই ইস্যুতে মাত্র ২ ঘন্টা ব্যয় করেছি এবং আমি কেন বুঝতে পারছি না যে কার্যকলাপে মুলতুবি থাকা ইন্টেন্ট হওয়া উচিত। এই ঘটনাটি কেন কেউ ব্যাখ্যা করতে পারেন?
রায় লি

getDismissIntent () হ'ল একটি স্থিতিশীল "সহায়ক" ফাংশন যা নোটিফিকেশনঅ্যাক্টিভিটির সাথে যোগাযোগের জন্য সঠিক ইন্টেন্ট তৈরি করে। এগুলি হিসাবে সাধারণত এগুলি ক্রিয়াকলাপের সাথে বান্ডিল হয়। তবে আপনি দেখতে পাচ্ছেন না কেন এই স্থির ফাংশনটি বিজ্ঞপ্তি নির্মাতা শ্রেণিতে স্থাপন করা যায়নি, আপনি যতক্ষণ না নোটিফিকেশন_আইডি এবং প্রসঙ্গটি সঠিকভাবে সেট করতে যত্নবান হন।
মাইক 20

17

আমি দেখতে পেয়েছি যে আপনি যখন প্রসারিত বিজ্ঞপ্তিগুলিতে অ্যাকশন বোতামগুলি ব্যবহার করবেন তখন আপনাকে অতিরিক্ত কোড লিখতে হবে এবং আপনি আরও সীমাবদ্ধ থাকেন।

ব্যবহারকারী কোনও অ্যাকশন বোতাম ক্লিক করলে আপনাকে ম্যানুয়ালি আপনার বিজ্ঞপ্তিটি বাতিল করতে হবে। ডিফল্ট ক্রিয়াকলাপের জন্য বিজ্ঞপ্তিটি স্বয়ংক্রিয়ভাবে বাতিল হয়ে যায়।

এছাড়াও আপনি যদি বোতামটি থেকে কোনও সম্প্রচারের রিসিভার শুরু করেন তবে বিজ্ঞপ্তি ড্রয়ারটি বন্ধ হয় না।

আমি এই সমস্যাগুলি সমাধান করার জন্য একটি নতুন বিজ্ঞপ্তি কার্যকলাপ তৈরি করে শেষ করেছি। কোনও UI ছাড়াই এই মধ্যস্থতাকারী ক্রিয়াকলাপটি বিজ্ঞপ্তিটি বাতিল করে এবং তারপরে আমি যে বিজ্ঞপ্তিটি সত্যই নোটিফিকেশন থেকে শুরু করতে চেয়েছিলাম তা শুরু করে।

আমি সম্পর্কিত পোস্টে নমুনা কোড পোস্ট করেছি অ্যান্ড্রয়েড বিজ্ঞপ্তি ক্রিয়া ক্লিক করে বিজ্ঞপ্তি ড্রয়ারটি বন্ধ করে দেয় না


2
খুব খারাপ তারা এখনও এটিকে এপিআইতে বেক করেনি ... এটি এটি করা খুব সুন্দর ish তবে এখনও একমাত্র উপায়, বিশেষত যদি ইউআরএল দেখার মতো গন্তব্যের অভিপ্রায় আপনার কোনও নিয়ন্ত্রণ না থাকে।
বোগদান জুড়াক

তথ্যের জন্য ধন্যবাদ, আপনি সঠিক। তবে আমি কোনও মধ্যস্থতাকারী ক্রিয়াকলাপের পরিবর্তে একটি অভিপ্রায় ব্যবহার করব
টিম

7

আপনি সর্বদা পারেন থেকে যাই হোক না কেন (ইন, যেমন কর্ম দ্বারা প্রার্থনা করা হচ্ছে কার্যকলাপ বাঁধা এর আপনাকে সরবরাহ )।cancel()NotificationonCreate()PendingIntentaddAction()


2
তবে যে কার্যকলাপটি বলা হয়েছে তাতে আমি কীভাবে বিজ্ঞপ্তিতে অ্যাক্সেস পাব?
এন্ডোভোনার

@ ফ্লেশাউন্ড: আপনি যখন ফোন করেছিলেন তখন আপনি cancel()যে আইডি ব্যবহার করেছিলেন তা আইডি নেয় । আপনার অবজেক্টের দরকার নেই । Notificationnotify()Notification
কমন্সওয়েয়ার

@ কমন্সওয়্যার বাতিল (আইডি) কাজ করা বন্ধ করে দিয়েছে যদি সেটগ্রুপটি সেট করা থাকে এবং সেখানে একটি গ্রুপ সারসংক্ষেপ বিজ্ঞপ্তি রয়েছে। এই ক্ষেত্রে, বাতিল কোনও কারণে কিছু করে না। গোষ্ঠী সংক্ষিপ্তসার ছাড়াই, যদিও কাজগুলি বাতিল করুন
কুশন

যদি আমার মুলতুবি উদ্দেশ্যটি হয় ACTION_VIEWএবং প্রকারটি image/jpeg(অন্য অ্যাপ্লিকেশনটির সাথে কোনও চিত্র ভাগ করে নেওয়ার জন্য) হয় তবে কীভাবে বাতিল হওয়াটি ট্রিগার হওয়ার কথা? আইএমও অ্যান্ড্রয়েডের স্বয়ংক্রিয়ভাবে বাতিল হওয়া উচিত, আমি কেন আশ্চর্য হয়ে পড়েছি যে অ্যান্ড্রয়েড কেবল এটির যত্ন নেয় না কেন ?!
কেউ কেউ কোথাও

@ সোমোনসোহোমহোয়ার: "তাহলে সেই বাতিলটি কীভাবে ট্রিগার হওয়ার কথা?" - এটা পারে না। যদিও কোনও Notificationসম্পর্কিত -তে কোনও তৃতীয় পক্ষের অ্যাপের দিকে ইশারা করা থেকে বিরত কিছু নেই PendingIntent, এটি আসলে কীভাবে এটি কাজ করার জন্য ডিজাইন করা হয়েছিল তা নয় এবং তাই আপনি এটির মতো সমস্যার মধ্যে চলে যাবেন। "আইএমও অ্যান্ড্রয়েডের স্বয়ংক্রিয়ভাবে বাতিল হওয়া উচিত" - আমি ক্রিয়াকলাপের জন্য এটির জন্য পতাকা সরবরাহ করতে দেখলাম, তবে এটি সর্বকালের বিষয় হওয়া উচিত নয়। যদি এটি হয় তবে কোনও সঙ্গীত প্লেয়ারের বিজ্ঞপ্তিতে একটি ট্র্যাক এড়িয়ে যাওয়া বিজ্ঞপ্তিটি বন্ধ করে দেবে।
কমন্সওয়্যার

7

আমার মতে একটি ব্যবহার করা BroadcastReceiverএকটি বিজ্ঞপ্তি বাতিল করার একটি ক্লিনার উপায়:

অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল:

<receiver 
    android:name=.NotificationCancelReceiver" >
    <intent-filter android:priority="999" >
         <action android:name="com.example.cancel" />
    </intent-filter>
</receiver>

জাভা ফাইলে:

Intent cancel = new Intent("com.example.cancel");
PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT);

NotificationCompat.Action actions[] = new NotificationCompat.Action[1];

NotificationCancelReceiver

public class NotificationCancelReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //Cancel your ongoing Notification
    };
}

1
আমি এটাই করি তবে আপনি কীভাবে বিজ্ঞপ্তি আইডি পাবেন (উদাহরণস্বরূপ, 0) অন রিসিপ পদ্ধতি থেকে? এটি ইন্টেন্টে নেই, কারণ এটি এতে যুক্ত হয়নি। আমি এটিকে অতিরিক্ত হিসাবে যুক্ত করার চেষ্টা করেছি তবে মনে হচ্ছে আসল বিজ্ঞপ্তি আইডিটি আমি তৈরির ক্রিয়াকলাপে অতিরিক্ত হিসাবে যুক্ত করছি না ...: - /
মার্কো জ্যানেটি

ক্রিয়াকলাপের পরিবর্তে সম্প্রচার পরিষেবাদি ব্যবহারের এই পদ্ধতিকে আমি সত্যিই পছন্দ করি, এটি খুব হালকা পদ্ধতির ho
ক্রিস্টোফ মাইন

তবে আমাকে দেখানো কোনও বিজ্ঞপ্তি বরখাস্ত করতে সক্ষম হওয়ার জন্য আমাকে << intent.setAction (Integer.toString (notificationsId));> ব্যবহার করতে হয়েছিল।
ক্রিস্টোফ

1
@ মারকোজেনেটি আপনাকে নোটিফিকেশন আইডি তৈরি করতে হবে যা আপনি মুলতুবি থাকা উদ্দেশ্যকে এবং নোটিফিকেশন প্রেরণের সময় নোটিফিক পদ্ধতিতে প্রেরণ করুন। যদি আপনি এটি করেন, তবে ব্যবহারকারী বাতিল করার জন্য ক্রিয়াটি ক্লিক করলে এটি সম্প্রচারকারীকে কল করবে এবং তারপরে আপনি অতিরিক্তগুলি থেকে বিজ্ঞপ্তি আইডি পেতে পারেন।
রে হান্টার

আপনি মাধ্যমে আইডি লাগাতে পারেন @ChristopheMoine intent.putExtra()এবং এটি পেতেBroadcastReceiver
ভাদিম Kotov

5

নতুন এপিআইগুলিতে ট্যাগ সম্পর্কে ভুলে যাবেন না:

notify(String tag, int id, Notification notification)

এবং অনুরূপভাবে

cancel(String tag, int id) 

পরিবর্তে:

cancel(int id)

https://developer.android.com/reference/android/app/NotificationManager


আপনি ঠিক বলেছেন! যদিও cancel()ফাংশনটির দুটি বাস্তবায়ন রয়েছে; একটি ট্যাগ সহ এবং অন্যটি ছাড়া। কিন্তু আমাদের একটি সরবরাহ করতে হবে TAG। এখানে cancelডক্স থেকে ফাংশন public void cancel(@Nullable String tag, int id)। Android Q- এ শেষবার চেক করা হয়েছে
Sud007

1

এই লাইনটি কেবল রাখুন:

 builder.setAutoCancel(true);

এবং সম্পূর্ণ কোডটি হ'ল:

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setSmallIcon(android.R.drawable.ic_dialog_alert);
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.in/"));
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    builder.setContentIntent(pendingIntent);
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.misti_ic));
    builder.setContentTitle("Notifications Title");
    builder.setContentText("Your notification content here.");
    builder.setSubText("Tap to view the website.");
    Toast.makeText(getApplicationContext(), "The notification has been created!!", Toast.LENGTH_LONG).show();

    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    builder.setAutoCancel(true);
    // Will display the notification in the notification bar
    notificationManager.notify(1, builder.build());

অ্যান্ডোক্যান্সেলের অ্যান্ড্রয়েড 9 টার্গেট করার সময় কোনও প্রভাব নেই বলে মনে হচ্ছে (অ্যান্ড্রয়েড 8.1 টার্গেট করার সময় সূক্ষ্মভাবে কাজ করেছে)
অ্যালিক্স

এখানে পার্থক্যটি কর্মের সাথে রয়েছে
কেউ কেউ কোথাও

0

বিজ্ঞপ্তিটি সরাতে আপনার উদ্দেশ্য সরিয়ে দেওয়ার পরে আপনাকে নিম্নলিখিত কোডটি চালানো দরকার।

NotificationManagerCompat.from(this).cancel(null, notificationId);

নোট: নোটিফিকেশনআইডিটি আপনার বিজ্ঞপ্তিটি চালানোর জন্য পাস করা একই আইডি


-3

builder.setAutoCancel (সত্য);

অ্যান্ড্রয়েড 9 এও পরীক্ষিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.