Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

एंड्रॉइड में नोटिफिकेशन टैप पर अंतिम एक्टिविटी कैसे खोलें?

यह गाइड बताता है कि नोटिफिकेशन पर टैप होने पर ऐप की **अंतिम खुली एक्टिविटी** (या टास्क स्टैक) को कैसे पुनर्स्थापित किया जाए, बजाय एक नई मुख्य एक्टिविटी लॉन्च करने के। यह एक सहज उपयोगकर्ता अनुभव प्रदान करता है जैसे ऐप कभी बंद नहीं हुआ था।

मुख्य अवधारणा: FLAG_ACTIVITY_CLEAR_TOP + SINGLE_TOP + TaskStackBuilder

सही फ्लैग संयोजन और TaskStackBuilder यह सुनिश्चित करता है कि मौजूदा टास्क स्टैक पुनर्स्थापित हो या उचित बैक नेविगेशन के साथ सही ढंग से बनाया जाए।

चरण 1: प्रोजेक्ट सेटअप

एंड्रॉइड स्टूडियो में Empty Activity प्रोजेक्ट बनाएँ। बेहतर प्रदर्शन के लिए एक दूसरी एक्टिविटी (DetailActivity) जोड़ें।

चरण 2: लेआउट (activity_main.xml)

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

चरण 3: MainActivity.java

package com.example.lastactivitynotification;

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 androidx.core.app.TaskStackBuilder;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private static final String CHANNEL_ID = "last_activity_channel";
    private static final String CHANNEL_NAME = "अंतिम एक्टिविटी नोटिफिकेशन";

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

        Button btn = findViewById(R.id.btnCreateNotification);
        btn.setOnClickListener(v -> createNotificationResumingLastActivity());
    }

    private void createNotificationResumingLastActivity() {
        createNotificationChannel();

        // लक्ष्य: DetailActivity (मान लें कि यह उपयोगकर्ता की अंतिम स्क्रीन थी)
        Intent notificationIntent = new Intent(this, DetailActivity.class);
        notificationIntent.putExtra("from_notification", true);
        notificationIntent.putExtra("item_id", 12345);

        // TaskStackBuilder उचित बैक स्टैक बनाता है: MainActivity → DetailActivity
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addNextIntentWithParentStack(notificationIntent);

        // PendingIntent प्राप्त करें जो पूरा स्टैक लॉन्च करता है
        PendingIntent pendingIntent = stackBuilder.getPendingIntent(
            0, 
            PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.ic_launcher_foreground)
            .setContentTitle("अंतिम एक्टिविटी फिर से शुरू करें")
            .setContentText("टैप करके वहीं जारी रखें जहाँ आप थे")
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setContentIntent(pendingIntent)
            .setAutoCancel(true);

        NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        int id = (int) System.currentTimeMillis();
        manager.notify(id, builder.build());
    }

    private void createNotificationChannel() {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
            channel.setDescription("अंतिम एक्टिविटी/टास्क स्टैक पुनर्स्थापित करता है");
            NotificationManager manager = getSystemService(NotificationManager.class);
            manager.createNotificationChannel(channel);
        }
    }
}

चरण 4: DetailActivity.java (दूसरी स्क्रीन)

package com.example.lastactivitynotification;

import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import android.widget.TextView;

public class DetailActivity extends AppCompatActivity {

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

        TextView tv = findViewById(R.id.tvDetail);
        int itemId = getIntent().getIntExtra("item_id", -1);
        tv.setText("विवरण स्क्रीन - आइटम आईडी: " + itemId + "\n\nबैक दबाएँ → MainActivity पर वापस");
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // नए नोटिफिकेशन डेटा के साथ अपडेट करें
        setIntent(intent);
        int itemId = intent.getIntExtra("item_id", -1);
        TextView tv = findViewById(R.id.tvDetail);
        tv.setText("अपडेट किया गया: आइटम आईडी " + itemId);
    }
}

चरण 5: activity_detail.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <TextView
        android:id="@+id/tvDetail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:text="विवरण सामग्री" />

</androidx.constraintlayout.widget.ConstraintLayout>

चरण 6: AndroidManifest.xml - उचित पैरेंट घोषणा महत्वपूर्ण है

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

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

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

        <!-- पैरेंट एक्टिविटी घोषित करें ताकि TaskStackBuilder बैक स्टैक बना सके -->
        <activity
            android:name=".DetailActivity"
            android:exported="false"
            android:parentActivityName=".MainActivity">
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value=".MainActivity" />
        </activity>

    </application>
</manifest>

क्यों TaskStackBuilder?

दृष्टिकोणपरिणाम
साधारण PendingIntent.getActivity()केवल लक्ष्य एक्टिविटी खोलता है; बैक दबाने पर होम स्क्रीन पर जाता है
TaskStackBuilderपूरा बैक स्टैक बनाता है (MainActivity → DetailActivity); बैक सही ढंग से काम करता है
FLAG_ACTIVITY_NEW_TASKनया टास्क बनाता है; मौजूदा ऐप इंस्टेंस से अलग

उन्नत: वास्तविक "अंतिम एक्टिविटी" डायनामिक रूप से ट्रैक करें

एक साझा प्राथमिकता या `Application` उपवर्ग में अंतिम विज़िट की गई एक्टिविटी को संग्रहीत करें:

public class MyApp extends Application {
    private static String lastActivityClassName = MainActivity.class.getName();

    public static void setLastActivity(Class activityClass) {
        lastActivityClassName = activityClass.getName();
    }

    public static Class getLastActivityClass() {
        try {
            return Class.forName(lastActivityClassName);
        } catch (ClassNotFoundException e) {
            return MainActivity.class;
        }
    }
}

// प्रत्येक एक्टिविटी में onResume() में:
@Override
protected void onResume() {
    super.onResume();
    MyApp.setLastActivity(getClass());
}

// नोटिफिकेशन बनाते समय:
Class targetClass = MyApp.getLastActivityClass();
Intent intent = new Intent(this, targetClass);

सर्वोत्तम अभ्यास

  1. मैनिफेस्ट में पैरेंट एक्टिविटी घोषित करें - TaskStackBuilder के लिए आवश्यक
  2. FLAG_UPDATE_CURRENT - सुनिश्चित करता है कि नवीनतम अतिरिक्त डेटा उपयोग किया जाता है
  3. onNewIntent() संभालें - यदि एक्टिविटी पहले से चल रही है तो UI अपडेट करें
  4. डीप लिंक के लिए परीक्षण करें - ऐप को पूरी तरह से बंद, पृष्ठभूमि में और अग्रभूमि में होने पर सत्यापित करें
  1. Android में रिमाइंडर नोटिफिकेशन कैसे बनाएं? Android में रिमाइंडर नोटिफिकेशन कैसे बनाएं?

    Android में रिमाइंडर नोटिफिकेशन बनाना यह उदाहरण दर्शाता है कि Android में रिमाइंडर नोटिफिकेशन कैसे बनाया जाता है। चरण 1 - नया प्रोजेक्ट बनाएं Android Studio में File → New Project पर जाएं और नया प्रोजेक्ट बनाने के लिए सभी आवश्यक विवरण भरें। चरण 2 - res/layout/activity_main.xml में कोड जोड़ें <?

  1. एंड्रॉइड में एक्टिविटी को कैसे रीस्टार्ट करें? एंड्रॉइड में एक्टिविटी को कैसे रीस्टार्ट करें?

    एंड्रॉइड एक्टिविटी को प्रोग्रामेटिकली रीस्टार्ट करना यह गाइड एक्टिविटी को रीस्टार्ट करने के विभिन्न तरीकों को दर्शाता है, जिसमें इंटेंट फ्लैग्स और रिक्रिएशन शामिल हैं। लेआउट (activity_main.xml) <RelativeLayout xmlns:android=https://schemas.android.com/apk/res/android android:layout_width=mat

  1. Android में सॉफ्ट कीबोर्ड के खुलने और बंद होने का लिस्टनर कैसे बनाएं? Android में सॉफ्ट कीबोर्ड के खुलने और बंद होने का लिस्टनर कैसे बनाएं?

    यह उदाहरण दर्शाता है कि Android एक्टिविटी में सॉफ्ट कीबोर्ड की विजिबिलिटी चेंज को कैसे डिटेक्ट किया जाता है। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project पर जाएं और प्रोजेक्ट बनाएं। चरण 2: लेआउट XML में कोड जोड़ें res/layout/activity_main.xml: <?xml version=1.0 encoding=utf-