किसी गतिविधि पर अधिसूचना-क्लिक से पैरामीटर कैसे भेजें?


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") );
    }

एक्स्ट्रा हमेशा शून्य होता है और मुझे अपने लॉग में कभी कुछ नहीं मिलता है।

Btw ... onCreateकेवल तभी चलाया जाता है जब मेरी गतिविधि शुरू होती है, अगर मेरी गतिविधि पहले से ही शुरू हो जाती है तो मैं एक्स्ट्रा इकट्ठा करना चाहता हूं और मुझे प्राप्त होने वाली वस्तु_ के अनुसार अपनी गतिविधि प्रस्तुत करना है।

कोई विचार?

जवाबों:


241

इस गाइड पर एक नज़र डालें ( एक अधिसूचना बनाने ) और ApiDemos "StatusBarNotifications" और "NotificationDisplay" के नमूने।

यदि गतिविधि पहले से चल रही है तो प्रबंधन के लिए आपके पास दो तरीके हैं:

  1. जोड़े FLAG_ACTIVITY_SINGLE_TOP आशय करने के लिए ध्वज जब गतिविधि शुरू करने, और फिर गतिविधि कक्षा में लागू onNewIntent (आशय आशय) सिर्फ getIntent बुला के रूप में जो एक ही नहीं है ईवेंट हैंडलर कि जिस तरह से आप नए आशय है कि गतिविधि के लिए बुलाया गया था का उपयोग कर सकते, ( (), यह हमेशा आपकी गतिविधि शुरू करने वाले पहले इरादे को लौटाएगा।

  2. नंबर एक के रूप में ही, लेकिन इरादे में एक झंडा जोड़ने के बजाय आपको अपनी गतिविधि AndroidManifest.xml में "सिंगलटॉप" जोड़ना होगा ।

यदि आप आशय एक्स्ट्रा कलाकार का उपयोग करते हैं, PendingIntent.getActivity()तो ध्वज के साथ कॉल करने के लिए रीमाइबर PendingIntent.FLAG_UPDATE_CURRENT, अन्यथा हर सूचना के लिए समान एक्स्ट्रास का पुन: उपयोग किया जाएगा।


95
और एक्स्ट्रा कलाकार के अशक्त होने के बारे में उपयोगकर्ता के प्रश्न का उत्तर देने के लिए: आपको PendingIntent.getActivity()ध्वज के साथ कॉल करना होगा PendingIntent.FLAG_UPDATE_CURRENT, अन्यथा हर सूचना पर उसी एक्स्ट्रा का पुन: उपयोग किया जाएगा।
मथायस

2
यू ने मेरा दिन बचाया लेकिन इस तरह से सरल डेटा को Android में क्यों स्थानांतरित कर रहा है
अवैध तर्क

8
आप पड़नी चाहिए विभिन्न सूचनाएं बुला अलग अनुरोध आईडी का उपयोग सुनिश्चित करें PendingIntent.getActivity()सेटिंग के अलावा FLAG_ACTIVITY_SINGLE_TOPपर Intentऔर FLAG_UPDATE_CURRENTपर PendingIntent। देखें stackoverflow.com/questions/7370324/...
schnatterer

101

मेरे आवेदन संदेश सूचनाओं को प्रदर्शित करने में मुझे इसी तरह की समस्या थी। जब कई सूचनाएं होती हैं और प्रत्येक अधिसूचना पर क्लिक करने से यह प्रदर्शित होता है कि अधिसूचना विवरण एक दृश्य संदेश गतिविधि में होता है। मैंने एक ही अतिरिक्त पैरामीटर की समस्या को हल किया है जो कि संदेश के इरादे से प्राप्त किया जा रहा है।

यहाँ कोड है जो यह तय किया है। अधिसूचना बनाने के लिए कोड।

 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");
}

20
शायद ओपी के लिए देर हो सकती है, लेकिन इंटरनेट में दूसरों के लिए कभी देर नहीं होती है :)
एस्पिनची

19

यहां एक ही मुद्दे का सामना करें। मैं इसे विभिन्न अनुरोध कोड का उपयोग करके हल करता हूं, PendingIntent बनाते समय अधिसूचना के रूप में एक ही आईडी का उपयोग करता हूं। लेकिन अभी भी पता नहीं है कि ऐसा क्यों किया जाना चाहिए।

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- गतिविधि के लिए मेनिफ़ेस्ट ऐड में android: launchMode = "singleTop"

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
इससे मेरा काम बनता है। विभिन्न अनुरोधकोड मान और PendingIntent.FLAG_UPDATE_CURRENT ध्वज का उपयोग करना चाहिए।
फुओन्गल

4

AndroidManifest.xml

LaunchMode = "singleTop" शामिल करें

<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

कुछ खोज करने के बाद मुझे Android डेवलपर गाइड से समाधान मिला

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);
...

ExampleActivity में अतिरिक्त मान प्राप्त करने के लिए, निम्न कोड का उपयोग करें:

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

बहुत महत्वपूर्ण नोट: आशय :: putExtra () विधि एक ओवरलोड से एक है। अतिरिक्त कुंजी प्राप्त करने के लिए, आपको Intent :: get [Type] Extra () विधि का उपयोग करने की आवश्यकता है ।

ध्यान दें: NOTIFICATION_ID और NOTIFICATION_CHANNEL_ID एक उदाहरण हैं, जो उदाहरण में व्यक्त किए गए हैं


1

G'day, मैं यह भी कह सकता हूं कि मैंने इन पोस्टों में उल्लिखित सब कुछ और कहीं और से कुछ और करने की कोशिश की। मेरे लिए # 1 समस्या यह थी कि नई इंटेंट में हमेशा एक अशक्त बंडल था। मेरा मुद्दा "मैंने इसमें .this या .that शामिल है" के विवरण पर बहुत अधिक ध्यान केंद्रित किया था। मेरा समाधान विस्तार से एक कदम वापस लेने और अधिसूचना की समग्र संरचना को देखने में था। जब मैंने यह किया कि मैं सही क्रम में कोड के प्रमुख भागों को रखने में कामयाब रहा। तो, अगर आप के लिए समान मुद्दों की जाँच कर रहे हैं:

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

2a. Bundle bundle = new Bundle();

// मुझे डेटा प्रकार को बेहतर तरीके से निर्दिष्ट करना पसंद है। उदा। बंडल

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"

गतिविधि शुरू करने के लिए अपने AndroidManifest.xml फ़ाइल में, आपको अपने इरादे में निम्नलिखित का उपयोग करना होगा:

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

कृपया इसका समाधान करते हुए अधिसूचना दिखाते हुए PendingIntent का उपयोग करें।

लंबित आशय = PendingIntent.getActivity (यह, 0, सूचना, लंबित, लंबित। FAGAG_UPDATE_CURRENT);

अंतिम फ़ील्ड के रूप में PendingIntent.FLAG_UPDATE_CURRENT जोड़ें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.