我观察过几个类似的问题,但他们无法帮助我。我需要在用户点击通知时显示上次活动。这是我的代码:
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;
}
第二点是,如果我使用弃用的metods来构建通知,显示最后一个活动的效果很好,因为我想要的是代码:
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!
我也见过this doc。
这是我的清单:
<?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>
答案 0 :(得分:10)
您的问题不在于您用于构建Notification
的方法。您的问题是您使用TaskStackBuilder
。使用这个类在幕后执行了很多隐藏的魔法,它对你希望应用程序的行为做出了很多假设。不幸的是,这些假设大多是错误的: - (
如果您只是想将应用程序带到前台,无论它在后台运行时处于什么状态,您都不想使用TaskStakBuilder
而且您也没有使用所有那些讨厌的ActivityManager
方法。就这样做:
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());