सूचना से गतिविधि शुरू करना

किसी सूचना से कोई गतिविधि शुरू करने पर, आपको उपयोगकर्ता के लिए नेविगेशन का वही अनुभव बनाए रखना होगा जो उसे पहले मिल रहा था. 'वापस जाएं' बटन पर टैप करने से, उपयोगकर्ता को ऐप्लिकेशन के सामान्य वर्कफ़्लो के ज़रिए होम स्क्रीन पर वापस जाना चाहिए. साथ ही, हाल ही में इस्तेमाल किए गए ऐप्लिकेशन की स्क्रीन खोलने पर, गतिविधि को अलग टास्क के तौर पर दिखाया जाना चाहिए. नेविगेशन के इस अनुभव को बनाए रखने के लिए, किसी नए टास्क में गतिविधि शुरू करें.

सूचना पर टैप करने के व्यवहार को सेट करने का बुनियादी तरीका, सामान्य सूचना बनाना में बताया गया है. इस पेज पर, सूचना के ऐक्शन के लिए PendingIntent सेट अप करने का तरीका बताया गया है, ताकि यह एक नया टास्क और बैक स्टैक बना सके. यह इस बात पर निर्भर करता है कि आपको किस तरह की गतिविधि शुरू करनी है:

  • सामान्य गतिविधि: यह ऐसी गतिविधि है जो आपके ऐप्लिकेशन के सामान्य यूज़र एक्सपीरियंस फ़्लो का हिस्सा है. जब उपयोगकर्ता सूचना से गतिविधि पर पहुंचता है, तो नए टास्क में पिछली गतिविधियां शामिल होनी चाहिए. इससे उपयोगकर्ता, ऐप्लिकेशन के क्रम में ऊपर की ओर जाने के लिए, 'वापस जाएं' बटन पर टैप कर सकता है.
  • खास गतिविधि: उपयोगकर्ता को यह गतिविधि सिर्फ़ तब दिखती है, जब इसे किसी सूचना से शुरू किया गया हो. एक तरह से, यह ऐक्टिविटी सूचना के यूज़र इंटरफ़ेस (यूआई) को बढ़ाती है. ऐसा इसलिए, क्योंकि इसमें ऐसी जानकारी दी जाती है जिसे सूचना में दिखाना मुश्किल होता है. इस गतिविधि के लिए, बैक स्टैक की ज़रूरत नहीं है.

नियमित गतिविधि के लिए PendingIntent सेट अप करना

सूचना से कोई सामान्य ऐक्टिविटी शुरू करने के लिए, TaskStackBuilder का इस्तेमाल करके PendingIntent सेट अप करें, ताकि यह इस तरह से नया पिछली गतिविधियां बना सके.

अपने ऐप्लिकेशन की ऐक्टिविटी के क्रम को तय करना

अपने ऐप्लिकेशन मेनिफ़ेस्ट फ़ाइल में मौजूद हर <activity> एलिमेंट में android:parentActivityName एट्रिब्यूट जोड़कर, अपनी ऐक्टिविटी के लिए नैचुरल हैरारकी तय करें. यह उदाहरण देखें:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<!-- MainActivity is the parent for ResultActivity. -->
<activity
    android:name=".ResultActivity"
    android:parentActivityName=".MainActivity" />
    ...
</activity>

पिछली गतिविधियों के स्टैक के साथ PendingIntent बनाना

गतिविधियों के बैक स्टैक वाली कोई गतिविधि शुरू करने के लिए, TaskStackBuilder का एक इंस्टेंस बनाएं और addNextIntentWithParentStack() को कॉल करें. साथ ही, शुरू की जाने वाली गतिविधि के लिए Intent पास करें.

जब तक हर गतिविधि के लिए पैरंट गतिविधि को पहले बताए गए तरीके से तय किया जाता है, तब तक getPendingIntent() को कॉल करके, पूरी पिछली गतिविधियां शामिल करने वाला PendingIntent पाया जा सकता है.

// Create an Intent for the activity you want to start.
val resultIntent = Intent(this, ResultActivity::class.java)
// Create the TaskStackBuilder.
val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run {
    // Add the intent, which inflates the back stack.
    addNextIntentWithParentStack(resultIntent)
    // Get the PendingIntent containing the entire back stack.
    getPendingIntent(
        0,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )
}

अगर ज़रूरी हो, तो स्टैक में मौजूद Intent ऑब्जेक्ट में आर्ग्युमेंट जोड़े जा सकते हैं. इसके लिए, TaskStackBuilder.editIntentAt() को कॉल करें. कभी-कभी यह ज़रूरी होता है, ताकि जब उपयोगकर्ता बैक स्टैक में मौजूद किसी गतिविधि पर नेविगेट करे, तो उसे काम का डेटा दिखे.

इसके बाद, सूचना में सामान्य तरीके से PendingIntent पास किया जा सकता है:

val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
    setContentIntent(resultPendingIntent)
    // ...
}
with(NotificationManagerCompat.from(this)) {
    notify(NOTIFICATION_ID, builder.build())
}

खास गतिविधि के लिए PendingIntent सेट अप करना

सूचना से शुरू होने वाली किसी खास गतिविधि के लिए बैक स्टैक की ज़रूरत नहीं होती. इसलिए, getActivity() को कॉल करके PendingIntent बनाया जा सकता है. हालांकि, मेनिफ़ेस्ट में टास्क के सही विकल्प तय करें.

  1. अपने मेनिफ़ेस्ट में, <activity> एलिमेंट में ये एट्रिब्यूट जोड़ें.

    android:taskAffinity=""
    कोड में इस्तेमाल किए जाने वाले FLAG_ACTIVITY_NEW_TASK फ़्लैग के साथ इस एट्रिब्यूट को खाली पर सेट करें. इससे यह पक्का किया जा सकेगा कि यह गतिविधि, ऐप्लिकेशन के डिफ़ॉल्ट टास्क में न जाए. ऐप्लिकेशन की डिफ़ॉल्ट अफ़िनिटी वाले मौजूदा टास्क पर इसका कोई असर नहीं पड़ता.
    android:excludeFromRecents="true"
    यह विकल्प, 'हाल ही के' स्क्रीन से नए टास्क को हटा देता है, ताकि उपयोगकर्ता गलती से वापस उस पर न चला जाए.

    इसे यहां दिए गए उदाहरण में दिखाया गया है:

    <activity
    android:name=".ResultActivity"
    android:launchMode="singleTask"
    android:taskAffinity=""
    android:excludeFromRecents="true">
    </activity>

  2. सूचना बनाएं और भेजें:

    1. एक Intent बनाएं, जो Activity को शुरू करे.
    2. Activity को नए और खाली टास्क में शुरू करने के लिए, FLAG_ACTIVITY_NEW_TASK और FLAG_ACTIVITY_CLEAR_TASK फ़्लैग के साथ setFlags() को कॉल करें.
    3. getActivity() को कॉल करके, PendingIntent बनाएं.

    इसे यहां दिए गए उदाहरण में दिखाया गया है:

    val notifyIntent = Intent(this, ResultActivity::class.java).apply {
        flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
    }
    val notifyPendingIntent = PendingIntent.getActivity(
        this, 0, notifyIntent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )

  3. PendingIntent को सूचना में हमेशा की तरह पास करें:

    val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
        setContentIntent(notifyPendingIntent)
        // ...
    }
    with(NotificationManagerCompat.from(this)) {
        notify(NOTIFICATION_ID, builder.build())
    }

टास्क के अलग-अलग विकल्पों और पिछली गतिविधियों के काम करने के तरीके के बारे में ज़्यादा जानने के लिए, टास्क और पिछली गतिविधियां लेख पढ़ें.