यह गाइड बताता है कि नोटिफिकेशन पर टैप होने पर ऐप की **अंतिम खुली एक्टिविटी** (या टास्क स्टैक) को कैसे पुनर्स्थापित किया जाए, बजाय एक नई मुख्य एक्टिविटी लॉन्च करने के। यह एक सहज उपयोगकर्ता अनुभव प्रदान करता है जैसे ऐप कभी बंद नहीं हुआ था।
मुख्य अवधारणा: 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);
सर्वोत्तम अभ्यास
- मैनिफेस्ट में पैरेंट एक्टिविटी घोषित करें - TaskStackBuilder के लिए आवश्यक
- FLAG_UPDATE_CURRENT - सुनिश्चित करता है कि नवीनतम अतिरिक्त डेटा उपयोग किया जाता है
- onNewIntent() संभालें - यदि एक्टिविटी पहले से चल रही है तो UI अपडेट करें
- डीप लिंक के लिए परीक्षण करें - ऐप को पूरी तरह से बंद, पृष्ठभूमि में और अग्रभूमि में होने पर सत्यापित करें