কোনও ক্রিয়াকলাপে কোনও বিজ্ঞপ্তি-ক্লিক থেকে পরামিতিগুলি কীভাবে প্রেরণ করবেন?


206

আমি আমার বিজ্ঞপ্তি থেকে আমার ক্রিয়াকলাপে পরামিতিগুলি প্রেরণের কোনও উপায় খুঁজে পেতে পারি।

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

আমার পরিষেবা থেকে কোড যা বিজ্ঞপ্তি তৈরি করে:

        // construct the Notification object.
     final Notification notif = new Notification(R.drawable.icon, tickerText, System.currentTimeMillis());


    final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
    contentView.setImageViewResource(R.id.image, R.drawable.icon);
    contentView.setTextViewText(R.id.text, tickerText);
    contentView.setProgressBar(R.id.progress,100,0, false);
    notif.contentView = contentView;        

    Intent notificationIntent = new Intent(context, Main.class);
    notificationIntent.putExtra("item_id", "1001"); // <-- HERE I PUT THE EXTRA VALUE
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
    notif.contentIntent = contentIntent;

    nm.notify(id, notif);

আমার ক্রিয়াকলাপের কোড যা বিজ্ঞপ্তি থেকে অতিরিক্ত প্যারামিটার আনার চেষ্টা করে:

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);


    Bundle extras = getIntent().getExtras();
    if(extras != null){
        Log.i( "dd","Extra:" + extras.getString("item_id") );
    }

অতিরিক্তগুলি সর্বদা নাল থাকে এবং আমি কখনই আমার লগে কিছু পাই না।

বিটিডব্লিউ ... onCreateকেবল তখনই চালানো হয় যখন আমার ক্রিয়াকলাপ শুরু হয়, যদি আমার ক্রিয়াকলাপটি ইতিমধ্যে শুরু হয়ে থাকে তবে আমি অতিরিক্তগুলিও সংগ্রহ করতে এবং আমার প্রাপ্ত আইটেম_আইড অনুসারে আমার ক্রিয়াকলাপ উপস্থাপন করতে চাই।

কোন ধারনা?

উত্তর:


241

এই গাইডটি দেখুন ( একটি বিজ্ঞপ্তি তৈরি করা ) এবং অ্যাপিডেমোস "স্ট্যাটাসবারনোটোটিকেশনস" এবং "নোটিফিকেশনডিসপ্লে" নমুনাগুলি দেখুন।

ক্রিয়াকলাপ ইতিমধ্যে চলমান থাকলে পরিচালনার জন্য আপনার দুটি উপায় আছে:

  1. ক্রিয়াকলাপটি চালু করার সময় ইনটেন্টে FLAG_ACTIVITY_SINGLE_TOP পতাকা যুক্ত করুন এবং তারপরে ক্রিয়াকলাপ শ্রেণিতে onNewInttent (উদ্দেশ্য অভিপ্রায়) ইভেন্ট হ্যান্ডলারটি প্রয়োগ করুন, সেইভাবে আপনি যে নতুন অভিপ্রায়টি ক্রিয়াকলাপের জন্য আহ্বান করেছিলেন তা অ্যাক্সেস করতে পারবেন (যা কেবল getInttent কল করার মতো নয়) (), এটি সর্বদা প্রথম ক্রিয়াকলাপটি ফিরিয়ে দেবে যা আপনার ক্রিয়াকলাপ শুরু করেছিল।

  2. এক নম্বর হিসাবে একই, তবে ইন্টেন্টে একটি পতাকা যুক্ত করার পরিবর্তে আপনাকে অবশ্যই আপনার ক্রিয়াকলাপে অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএলে "সিঙ্গলটপ" যুক্ত করতে হবে ।

আপনি যদি অভিপ্রায় অতিরিক্ত ব্যবহার PendingIntent.getActivity()করেন তবে পতাকাটির সাথে কল করার জন্য রিমবার ব্যবহার করুন PendingIntent.FLAG_UPDATE_CURRENT, অন্যথায় প্রতিটি বিজ্ঞপ্তির জন্য একই অতিরিক্তগুলি পুনরায় ব্যবহার করা হবে।


95
এবং অতিরিক্তগুলি শূন্য হওয়া সম্পর্কে ব্যবহারকারীর প্রশ্নের জবাব দিতে: আপনাকে PendingIntent.getActivity()পতাকা সহ কল করতে হবে PendingIntent.FLAG_UPDATE_CURRENT, অন্যথায় প্রতিটি বিজ্ঞপ্তির জন্য একই অতিরিক্তগুলি পুনরায় ব্যবহার করা হবে।
ম্যাথিয়াস

2
আপনি আমার দিন বাঁচিয়েছেন তবে অ্যান্ড্রয়েডে এত জটিল জটিল সরল ডেটা স্থানান্তর কেন করা হচ্ছে
অবৈধ যুক্তি

8
তোমার উচিত ছিল তাহলে বিভিন্ন হলে বিজ্ঞপ্তি কলিং বিভিন্ন অনুরোধ ID- র ব্যবহার নিশ্চিত করতে PendingIntent.getActivity()সেটিং ছাড়াও FLAG_ACTIVITY_SINGLE_TOPউপর Intentএবং FLAG_UPDATE_CURRENTউপর PendingIntent। দেখুন stackoverflow.com/questions/7370324/...
schnatterer

101

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

এখানে কোড যা এটি স্থির করেছে। নোটিফিকেশন ইন্টেন্ট তৈরির জন্য কোড।

 Intent notificationIntent = new Intent(getApplicationContext(), viewmessage.class);
    notificationIntent.putExtra("NotificationMessage", notificationMessage);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(),notificationIndex,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.setLatestEventInfo(getApplicationContext(), notificationTitle, notificationMessage, pendingNotificationIntent);

বার্তা ক্রিয়াকলাপ দেখার জন্য কোড।

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    onNewIntent(getIntent());
}

@Override
public void onNewIntent(Intent intent){
    Bundle extras = intent.getExtras();
    if(extras != null){
        if(extras.containsKey("NotificationMessage"))
        {
            setContentView(R.layout.viewmain);
            // extract the extra-data in the Notification
            String msg = extras.getString("NotificationMessage");
            txtView = (TextView) findViewById(R.id.txtMessage);
            txtView.setText(msg);
        }
    }


}

29

কিছুটা দেরি হতে পারে তবে: এর পরিবর্তে:

public void onNewIntent(Intent intent){
    Bundle extras = intent.getExtras();
    Log.i( "dbg","onNewIntent");

    if(extras != null){
        Log.i( "dbg", "Extra6 bool: "+ extras.containsKey("net.dbg.android.fjol"));
        Log.i( "dbg", "Extra6 val : "+ extras.getString("net.dbg.android.fjol"));

    }
    mTabsController.setActiveTab(TabsController.TAB_DOWNLOADS);
}

এটা ব্যবহার কর:

Bundle extras = getIntent().getExtras();
if(extras !=null) {
    String value = extras.getString("keyName");
}


19

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

PendingIntent contentIntent = PendingIntent.getActivity(context, **id**, notificationIntent, 0);
notif.contentIntent = contentIntent;
nm.notify(**id**, notif);

14

কিছু ইমেল-তালিকা এবং অন্যান্য ফোরামগুলি পড়ার পরে আমি দেখতে পেলাম যে কৌশলটি উদ্দেশ্যটির সাথে কিছু অনন্য ডেটা যুক্ত করেছে।

এটার মত:

   Intent notificationIntent = new Intent(Main.this, Main.class);
   notificationIntent.putExtra("sport_id", "sport"+id);
   notificationIntent.putExtra("game_url", "gameURL"+id);

   notificationIntent.setData((Uri.parse("foobar://"+SystemClock.elapsedRealtime()))); 

আমি বুঝতে পারি না কেন এটি করা দরকার, এটি কেবলমাত্র অতিরিক্তগুলির দ্বারা চিহ্নিত করা যেতে পারে অভিপ্রায়টির সাথে এটি করার কিছু ছিল ...


8
অ্যানড্রয়েড ইন্টেন্টগুলি পুনরায় ব্যবহার করে, উদ্দেশ্য ক্রিয়া এবং অনুরোধ কোড এটিকে অনন্য করে তোলে, তবে অতিরিক্ত ডেটা নয়। সুতরাং আপনাকে একটি অনন্য অনুরোধ আইডি সেট করতে হবে বা বিভিন্ন অভিপ্রায় ক্রিয়া ব্যবহার করতে হবে।
বাচি

10

আমি সবকিছু চেষ্টা করেছিলাম কিন্তু কিছুই কাজ করেনি।

অবশেষে নিম্নলিখিত সমাধান নিয়ে এসেছিল।

1- ক্রিয়াকলাপের জন্য ম্যানিফেস্ট অ্যাডে অ্যান্ড্রয়েড: লঞ্চমোড = "সিঙ্গলটপ"

2- মুলতুবি করার উদ্দেশ্যে নিম্নলিখিতটি করার সময়, সরাসরি ইন্টেন্ট.পুটস্ট্রিং () বা ইন্টেন্ট.পুটইন্ট () ব্যবহার করার পরিবর্তে বান্ডিলটি ব্যবহার করুন

                    Intent notificationIntent = new Intent(getApplicationContext(), CourseActivity.class);

                    Bundle bundle = new Bundle();
                    bundle.putString(Constants.EXAM_ID,String.valueOf(lectureDownloadStatus.getExamId()));
                    bundle.putInt(Constants.COURSE_ID,(int)lectureDownloadStatus.getCourseId());
                    bundle.putString(Constants.IMAGE_URL,lectureDownloadStatus.getImageUrl());

                    notificationIntent.putExtras(bundle);

                    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                            Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),
                            new Random().nextInt(), notificationIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT); 

3
এটা আমার জন্য কাজ করে. পৃথক অনুরোধ কোড কোড এবং মুলতুবিকরণের জন্য অবশ্যই ব্যবহার করা উচিত F FLAG_UPDATE_CURRENT পতাকা।
ফুঙ্গল

4

Andro আইডি

লঞ্চমোড = "একক শীর্ষ" অন্তর্ভুক্ত করুন

<activity android:name=".MessagesDetailsActivity"
        android:launchMode="singleTop"
        android:excludeFromRecents="true"
        />

SMSReceiver.java

ইন্টেন্ট এবং পেন্ডিং ইন্টেন্টের জন্য পতাকাগুলি সেট করুন

Intent intent = new Intent(context, MessagesDetailsActivity.class);
    intent.putExtra("smsMsg", smsObject.getMsg());
    intent.putExtra("smsAddress", smsObject.getAddress());
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent contentIntent = PendingIntent.getActivity(context, notification_id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

MessageDetailsActivity.java

onResume () - প্রতিবার কল হয়ে যায়, অতিরিক্তগুলি লোড করে।

Intent intent = getIntent();
    String extraAddress = intent.getStringExtra("smsAddress");
    String extraBody = intent.getStringExtra("smsMsg");

আশা করি এটি সহায়তা করে, এটি স্ট্যাকওভারফ্লোতে অন্য উত্তরের উপর ভিত্তি করে তৈরি হয়েছিল, তবে এটি আমার জন্য সবচেয়ে আপডেট হওয়া।


3

এটি সহজ, এটি আমার সমাধান অবজেক্টস ব্যবহার করে!

আমার POJO

public class Person implements Serializable{

    private String name;
    private int age;

    //get & set

}

পদ্ধতির বিজ্ঞপ্তি

  Person person = new Person();
  person.setName("david hackro");
  person.setAge(10);

    Intent notificationIntent = new Intent(this, Person.class);
    notificationIntent.putExtra("person",person);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.notification_icon)
                .setAutoCancel(true)
                .setColor(getResources().getColor(R.color.ColorTipografiaAdeudos))
                .setPriority(2)
                .setLargeIcon(bm)
                .setTicker(fotomulta.getTitle())
                .setContentText(fotomulta.getMessage())
                .setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT))
                .setWhen(System.currentTimeMillis())
                .setContentTitle(fotomulta.getTicketText())
                .setDefaults(Notification.DEFAULT_ALL);

নতুন ক্রিয়াকলাপ

 private Person person;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notification_push);
    person = (Person) getIntent().getSerializableExtra("person");
}

শুভকামনা !!


3

কিছু অনুসন্ধান করার পরে আমি অ্যান্ড্রয়েড বিকাশকারী গাইড থেকে সমাধান পেয়েছি

PendingIntent contentIntent ;
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("extra","Test");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

stackBuilder.addParentStack(ArticleDetailedActivity.class);

contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

পরীক্ষার ক্রিয়াকলাপ শ্রেণিতে ইন্টেন্ট অতিরিক্ত মান পেতে আপনাকে নিম্নলিখিত কোডটি লিখতে হবে:

 Intent intent = getIntent();
 String extra = intent.getStringExtra("extra") ;

3
কিসের stackBuilderজন্য?
অ্যালেক্সিওভে

1

আপনার বিজ্ঞপ্তি বাস্তবায়নে, এই জাতীয় কোড ব্যবহার করুন:

NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
...
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra("EXTRA_KEY", "value");

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
nBuilder.setContentIntent(pendingIntent);
...

উদাহরণঅ্যাক্টিভিটিতে ইন্টেন্ট অতিরিক্ত মান পেতে, নিম্নলিখিত কোডটি ব্যবহার করুন:

...
Intent intent = getIntent();
if(intent!=null) {
    String extraKey = intent.getStringExtra("EXTRA_KEY");
}
...

খুবই গুরুত্বপূর্ণ উল্লেখ্য: ইন্টেন্ট :: putExtra () পদ্ধতি একটি ওভারলোড অন্যতম। অতিরিক্ত কী পেতে আপনার ইনটেন্ট :: পেতে [টাইপ] অতিরিক্ত () পদ্ধতিটি ব্যবহার করতে হবে।

দ্রষ্টব্য: NOTIFICATION_ID এবং NOTIFICATION_CHANNEL_ID হ'ল উদাহরণঅ্যাক্টিভিটিতে ঘোষিত একটি ধ্রুবক


1

G'day, আমিও বলতে পারি যে আমি এই পোস্টগুলিতে উল্লিখিত সমস্ত কিছু এবং অন্য কোথাও থেকে আরও কিছু চেষ্টা করেছি। আমার জন্য # 1 সমস্যাটি হ'ল নতুন ইন্টেন্টে সর্বদা নাল বান্ডিল থাকে। আমার সমস্যাটি "আমি এতে অন্তর্ভুক্ত করেছি। এটি বা .ত" এর বিবরণটিতে খুব বেশি মনোযোগ দিয়েছিল। আমার সমাধানটি বিশদ থেকে একধাপ পিছনে নেওয়ার এবং বিজ্ঞপ্তির সামগ্রিক কাঠামোটি দেখার ছিল। যখন আমি এটি করেছি যে আমি কোডের মূল অংশগুলি সঠিক অনুক্রমে রেখেছি। সুতরাং, যদি আপনার একই সমস্যা হয় তবে এটির জন্য পরীক্ষা করুন:

1. Intent notificationIntent = new Intent(MainActivity.this, NotificationActivity.class);

2a. Bundle bundle = new Bundle();

// আমি আরও ভাল ডেটা টাইপ নির্দিষ্ট করতে চাই। যেমন bundle.putInt

2b. notificationIntent.putExtras(bundle);
3. PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, WIZARD_NOTIFICATION_ID, notificationIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
4. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
5.          NotificationCompat.Builder nBuilder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.ic_notify)
                            .setContentTitle(title)
                            .setContentText(content)
                            .setContentIntent(contentIntent)
                            .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
                            .setAutoCancel(false)//false is standard. true == automatically removes the notification when the user taps it.
                            .setColor(getResources().getColor(R.color.colorPrimary))
                            .setCategory(Notification.CATEGORY_REMINDER)
                            .setPriority(Notification.PRIORITY_HIGH)
                            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
            notificationManager.notify(WIZARD_NOTIFICATION_ID, nBuilder.build());

এই ক্রমটি সহ আমি একটি বৈধ বান্ডিল পাই।


0

আপনি যদি ব্যবহার

android:taskAffinity="myApp.widget.notify.activity"
android:excludeFromRecents="true"

ক্রিয়াকলাপটি চালু করার জন্য আপনার অ্যান্ড্রয়েড ম্যানিফেস্ট.এক্সএমএল ফাইলটিতে আপনাকে নিম্নলিখিতগুলি নিজের উদ্দেশ্যতে ব্যবহার করতে হবে:

Intent notificationClick = new Intent(context, NotifyActivity.class);
    Bundle bdl = new Bundle();
    bdl.putSerializable(NotifyActivity.Bundle_myItem, myItem);
    notificationClick.putExtras(bdl);
    notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId()));
    notificationClick.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);  // schließt tasks der app und startet einen seperaten neuen

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(NotifyActivity.class);
    stackBuilder.addNextIntent(notificationClick);

    PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(notificationPendingIntent);

গুরুত্বপূর্ণ হ'ল অনন্য ডেটা সেট করা যেমন একটি অনন্য আইডি ব্যবহার করে:

notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId()));


0

সমাধান হওয়ার চেয়ে বিজ্ঞপ্তি দেখানোর সময় দয়া করে মুলতুবি হিসাবে ব্যবহার করুন।

পেন্ডিং ইন্টেন্ট ইন্টেন্ট = পেন্ডিং ইন্টেন্ট.জেটঅ্যাক্টিভিটি (এটি, 0, বিজ্ঞপ্তিহীনতা, মুলতুবিযুক্তকরণ FFLAG_UPDATE_CURRENT);

পেন্ডিংআইজন্ট যোগ করুন last শেষ ক্ষেত্র হিসাবে FLAG_UPDATE_CURRENT।

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