在没有新意图的情况下,我应该如何从通知返回到活动
Posted
技术标签:
【中文标题】在没有新意图的情况下,我应该如何从通知返回到活动【英文标题】:How should i do from notification back to activity without new intent 【发布时间】:2013-08-27 19:40:59 【问题描述】:来自 android 开发,我通过示例代码实现了一个简单的通知,但是在我的应用程序中,我不想新的意图并再次创建活动,我只想回到我的上一个活动(它是一个媒体播放器 UI )。如果我使用示例代码,它将通过
创建一个新活动Intent resultIntent = new Intent(this, ResultActivity.class);
我评论了有关新意图的相关代码并收到了通知,但不知道如何回到我的上一个活动...
长按主页键返回我的应用程序并触摸我的应用程序就可以了。 我想要的就是这种行为。
bleow 是来自 Android 开发的示例代码,我评论了新的意图部分。
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!");
/*Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(ResultActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);*/
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(mId, mBuilder.build());
[更新]
我认为我需要为活动的意图和属性设置标志。 因此,对于我想回到我设置的活动
android:launchMode="singleInstance"
因为,我不想要一个来自意图的新活动,我只想要我的最后一个活动,所以我添加了
Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
从文档中我了解到,使用 Pendingintent.contentIntent 它必须包含 FLAG_ACTIVITY_NEW_TASK 标志,并且在使用此标志时,如果任务已经在为您现在的活动运行启动,则不会启动新的活动;相反,当前任务将简单地以其上次所处的状态被带到屏幕的前面。所以我还添加了
Intent.FLAG_ACTIVITY_NEW_TASK
但是从 logCat 中,我仍然看到,当我触摸返回活动的通知时,pendingintent 仍然调用 onCreate() 函数,而不是仅仅显示仍然“活着”的最后一个活动。
【问题讨论】:
我从***.com/questions/2424488/… 得到了解决方案,但没有运气:( 【参考方案1】:如果你想从后台调用 Activity,试试这个:
Intent intent = new Intent(this, YourLauncherActivity.class);
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
intent, 0);
mBuilder.setContentIntent(pendingIntent);
如果您在主屏幕上单击通知,则您的应用程序的最后显示的 Activity 将进入前台,而无需重新启动它。如果 Activity 被系统杀死,你会得到一个新的 Activity。
【讨论】:
但是以这种方式支持的活动将与我的原始应用程序分离:(即活动(A)->活动(B)同时为B做PendingIntent。当我从通知,我不能再回到A了... 这很奇怪。你还在用android:launchMode="singleInstance"
吗?
是的。我没有修改那个。我需要为 PendingIntent 中使用的这个 Activity 设置 parentActivity 吗?
我为我的 minSDKVersion 但没有运气,然后尝试添加 TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(ResultActivity.class); stackBuilder.addNextIntent(resultIntent);但仍然没有运气...这种情况链接***.com/questions/13632480/…
无论如何,再次感谢您的大力帮助。我认为这是我需要解决的另一个问题:)【参考方案2】:
我使用了 PendingIntent.getActivities 而不是 getActivity。这在我的项目中运行良好。
Intent backIntent = new Intent(this, HomeActivity.class);
backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Intent notificationIntent = new Intent(this, NextActivity.class);
final PendingIntent pendingIntent = PendingIntent.getActivities(this, 1,
new Intent[] backIntent, notificationIntent, PendingIntent.FLAG_ONE_SHOT);
【讨论】:
【参考方案3】:对我来说,这很有效:
.setContentIntent( PendingIntent.getActivity( context, 0, new Intent(context, YOUR_MAIN.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP ),PendingIntent.FLAG_ONE_SHOT))
FLAG_ONE_SHOT:不要创建两次(与 Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP)
【讨论】:
【参考方案4】:在SingleTop
模式下,我使用这个方法没有明确定义根活动类:
Intent intent = new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_LAUNCHER)
.setComponent(getPackageManager().getLaunchIntentForPackage(getPackageName()).getComponent());
这将从通知中恢复上次活动:
builder.setContentIntent(PendingIntent.getActivity(context, 0, intent, 0));
或者这样从服务中恢复上一个活动:
try
PendingIntent.getActivity(this, 0, intent, 0).send();
catch (CanceledException e)
e.printStackTrace();
【讨论】:
【参考方案5】:代码听到
Intent resultIntent = new
Intent(getApplicationContext(),MainActivity.class);
resultIntent.putExtra("splash",2);
resultIntent.putExtra("message","beacons");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addNextIntentWithParentStack(resultIntent);
resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent notifyPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);
notificationCompatBuilder.setContentIntent(notifyPendingIntent);
Intent intent = this.getIntent();
Bundle extras = intent.getExtras();
if (extras != null)
String extraValue = extras.getString("notificationType");
if(extraValue !=null)
int value = Integer.parseInt(extraValue);
if (value == 1)
intent = new Intent(SplashActivity.this,MainActivity.class);
intent.putExtra("splash",value);
intent.putExtra("message", "fromsplash");
startActivity(intent);
finish();
else
if (value == 2)
intent = new Intent(SplashActivity.this,MainActivity.class);
intent.putExtra("swip","2");
intent.putExtra("message", "beacons");
startActivity(intent);
finish();
【讨论】:
以上是关于在没有新意图的情况下,我应该如何从通知返回到活动的主要内容,如果未能解决你的问题,请参考以下文章