我能描述问题的最好方法是:
BroadcastReceiver
)。如何防止最后一步?我想要的后退按钮是回到原来的位置,这是主屏幕(包含所有小部件和应用程序图标的桌面)。我的应用程序的主要活动应该是在后台运行,为什么用后退按钮调用它?
如果相关,我创建通知的代码如下:
public void createNotification(int notifyId, int iconId, String contentTitle, String contentText) {
Intent intent = new Intent(mContext, NewNoteActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(AgendaNotesAdapter.KEY_ROW_ID, (long)notifyId);
PendingIntent contentIntent = PendingIntent.getActivity(mContext, notifyId, intent, 0);
Notification notification = new Notification(iconId, contentTitle, 0);
notification.setLatestEventInfo(mContext, contentTitle, contentText, contentIntent);
mNotificationManager.notify(notifyId, notification);
我尝试向intent
添加了几个标志组合,但它们都没有解决我的问题...建议?
答案 0 :(得分:19)
谁仍然可能需要回答。看起来这就是你想要实现的目标:
当您从通知中启动
Activity
时,您必须保留用户的预期导航体验。单击后退应该让用户通过应用程序的正常工作流回到主屏幕,然后单击最近应将活动显示为单独的任务。
http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse
您的情况是 - Setting up a regular activity PendingIntent
请参阅链接中的完整步骤。基本上你需要:
1.在 AndroidManifest.xml
Activity
层次结构
<activity
android:name=".MainActivity"
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=".ResultActivity"
android:parentActivityName=".MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/>
</activity>
2.根据启动Intent
的{{1}}创建后台:
Activity
答案 1 :(得分:5)
有同样的问题。 对我有用的是在清单中为通知启动的活动设置以下属性:
android:taskAffinity=""
这基本上将通知活动的亲和力与主要活动分开,因此操作系统感觉不需要“返回”主活动,而只是返回之前的那些活动,例如“桌面”。
答案 2 :(得分:3)
我的问题在于以下步骤,因为我知道你的问题是
1.启动完成后创建通知
2.主要活动将在启动时调用
3.按下主页按钮,主要活动将停止,但不会销毁
4.您点击状态栏中的通知,以便application will be resume
,以便您已经在后台堆栈中进行了主要活动,并且通知将创建您在问题中提到的新活动NewNoteActivity活动将推送回堆栈.SO在此步骤you have two activities in back stack
5.您按下了按钮,以便last activity will be destroy
和您的main activity will be resume
但是您想要转到主页屏幕。
所以你的问题在于以下步骤,因为我从你的问题中知道
1.启动完成后创建通知
2.主要活动将在启动时调用
3.按下主页按钮,主要活动将停止,但不会销毁
4.您点击状态栏中的通知,以便application will be resume
,以便您已经在后台堆栈中进行了主要活动,并且通知将创建您在问题中提到的新活动NewNoteActivity活动将推送回堆栈.SO在此步骤you have two activities in back stack
5.您按下后退按钮以便last activity will be destroy
和main activity will be resume
但是当您按下NewNoteActivity活动的后退按钮时,您想要打开主页活动。
因此,解决方案是,当您从NewNoteActivityactivity按下后退按钮时,再次使用Intent.FLAG_ACTIVITY_CLEAR_TOP
标志启动主要活动,以便您的主要活动将重新创建并接收onNewIntent()
方法,以便您可以获得标记你可以完成主要活动
例如
@Override
public void onBackPressed() {
Intent i = new Intent(this, Main.class);
i.putExtra("exit", true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
super.onBackPressed();
}
现在您必须在主要活动中实施onNewIntent()
方法
在从NewNoteActivity活动按下的后退按钮上,您的Main活动将调用onNewIntent()
方法,因此在此方法中您必须获取从NewNoteActivity活动传递的标志变量。如果您获得标志并且如果它是真的那么就完成主要活动,以便您将获得主屏幕。
修改强>
您说您已打开A,B或C中的任何活动并按下后退按钮以关闭此活动。如果此时您只有一个活动,那么您的应用程序将是关闭意味着你将进入主屏幕。但是如果你有多个活动并按下后退按钮,你至少有一个活动在堆栈中,现在你点击通知,这样就会打开一个与你的通知相关的新活动,这样就可以了活动将被推到后面的堆栈上。现在,如果您按下后退按钮,如果您没有在该活动中修改onBackPressed()方法,那么您将关闭与您的通知相关联的上一个活动,然后如果有任何活动,它将检查堆栈在后台堆栈中,以便恢复活动或如果后台堆栈中没有活动,那么您的应用程序将被关闭,您将进入主屏幕
答案 3 :(得分:2)
我在我的应用中使用此解决方案。 覆盖onBackPressed(在您从通知路由的活动中)并检查您的应用是否在堆栈中。如果没有,那么开始您的根活动。用户始终可以从根活动导航。这就是我在我的应用程序中所做的事情
@Override
public void onBackPressed() {
if (isTaskRoot()) {
Intent intent = new Intent(this,YourMainActivity.class);
startActivity(intent);
super.onBackPressed();
}else {
super.onBackPressed();
}
}
答案 4 :(得分:0)
它对我有用。试试这个:
notifyIntent.setAction(Intent.ACTION_MAIN);
notifyIntent.addCategory(Intent.CATEGORY_LAUNCHER);