I have observed several similar questions but they couldn`t help me. I need to display last activity when user click notification. Here is my code:
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(YourService.this)
.setContentTitle(getResources().getText(R.string.app_name))
.setContentText(getServiceStateDescription(YourService.this))
.setSmallIcon(iconId)
.setWhen(System.currentTimeMillis());
Intent nIntent = getPreviousIntent();
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack
stackBuilder.addParentStack(MainActivity_.class);
stackBuilder.addNextIntent(nIntent);
PendingIntent pendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setContentIntent(pendingIntent);
startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID, notificationBuilder.build());
private Intent getPreviousIntent() {
Intent newIntent = null;
final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
final List<ActivityManager.AppTask> recentTaskInfos = activityManager.getAppTasks();
if (!recentTaskInfos.isEmpty()) {
for (ActivityManager.AppTask appTaskTaskInfo: recentTaskInfos) {
if (appTaskTaskInfo.getTaskInfo().baseIntent.getComponent().getPackageName().equals(ContextConstants.PACKAGE_NAME)) {
newIntent = appTaskTaskInfo.getTaskInfo().baseIntent;
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
}
}
} else {
final List<ActivityManager.RecentTaskInfo> recentTaskInfos = activityManager.getRecentTasks(1024, 0);
if (!recentTaskInfos.isEmpty()) {
for (ActivityManager.RecentTaskInfo recentTaskInfo: recentTaskInfos) {
if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(ContextConstants.PACKAGE_NAME)) {
newIntent = recentTaskInfo.baseIntent;
newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
}
}
}
if (newIntent == null) newIntent = new Intent();
return newIntent;
}
Second point is that if i used deprecated metods in order to build notification, displaying last activity works great as i wanted here is code:
Notification note = new Notification(iconId,
getResources().getText(R.string.serviceStarted),
System.currentTimeMillis());
note.flags |= Notification.FLAG_ONGOING_EVENT;
note.flags |= Notification.FLAG_NO_CLEAR;
Intent nIntent = new Intent();
nIntent = getPreviousIntent(nIntent);
PendingIntent pi = PendingIntent.getActivity(this, 0, nIntent, 0);
note.setLatestEventInfo(this,
getResources().getText(R.string.app_name), getServiceStateDescription(YourService.this), pi);
startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID, note);
But i don't want use deprecated metods anymore, that's why i'm here explaining. Thanks in advance!
And i've seen this doc as well.
Here is my manifest:
<?xml version="1.0" encoding="utf-8"?>
<permission android:name="com.my.package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<uses-permission android:name="com.my.package.permission.C2D_MESSAGE" />
<uses-permission android:name="android.permission.GET_TASKS"/>
<application
android:name=".MyApplication"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/Theme.AppCompat.Light">
<activity android:name=".activity.StartingActivity_" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".activity.MainActivity_"
android:configChanges="orientation|screenSize">
</activity>
<activity
android:name=".activity.ComposeEmailActivity_"
android:configChanges="orientation|screenSize"
android:parentActivityName=".activity.MainActivity_">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.MainActivity_" />
</activity>
<activity
android:name=".activity.EditAccountActivity_"
android:configChanges="orientation|screenSize"
android:parentActivityName=".activity.MainActivity_">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.MainActivity_" />
</activity>
<!--android:process=":remote" is for working in background-->
<service android:enabled="true" android:name=".service.YourService"/>
</application>
You can see your Android notification history on Android 11 through the Settings app. You first need to turn on Notification history in your phone's notification settings. You will then be able to see all the alerts you dismissed in the past 24 hours.
Your problem isn't with the methods you are using to build the Notification
. Your problem is your use of TaskStackBuilder
. Using this class performs a lot of hidden magic behind the scenes and it makes a lot of assumptions about how your want the app to behave. Unfortunately, these assumptions are mostly wrong :-(
If you just want to bring your application to the foreground in whatever state it was in when it went to the background, you don't want to use TaskStakBuilder
and you also don't have to use all those nasty ActivityManager
methods. Just do this:
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(YourService.this)
.setContentTitle(getResources().getText(R.string.app_name))
.setContentText(getServiceStateDescription(YourService.this))
.setSmallIcon(iconId)
.setWhen(System.currentTimeMillis());
Intent nIntent = getPackageManager().
getLaunchIntentForPackage(ContextConstants.PACKAGE_NAME);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, nIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setContentIntent(pendingIntent);
startForeground(ContextConstants.LAUNCHER_SERVICE_NOTE_ID,
notificationBuilder.build());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With