7

我能描述我的问题,最好的办法是这样的:在启动创建通知打开活动,后退按钮被按下,主要活动被打开?

  1. 的通知(用BroadcastReceiver)。
  2. 我的应用程序的主要活动打开并按下home按钮(应用程序仍在后台运行,直到系统关闭它)。
  3. 我拉下状态栏并按下之前在启动时创建的通知。
  4. 开始一些与主要活动不同的活动。
  5. 我按下后退按钮,显示主要活动。

如何防止最后一步?我想要的后退按钮是回到我所在的位置,即主屏幕(包含所有小部件和应用程序图标的桌面)。我的应用程序的主要活动应该是在后台运行,为什么它使用后退按钮调用?

在情况下,它是相关的,我的代码来创建一个通知是这样的:

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,但都没有解决我的问题......建议?

回答

3

你的问题出在下面的步骤,因为我知道,从你的问题是

1,创建通知后,启动完成

二,主要活动将呼吁启动

3.you压到底按钮,所以主要活动将停止,但不会破坏

4.你点击状态栏中的通知,所以你的application will be resume,这样你就已经在你的后台堆栈和通知将主要活动创造像你ê新的活动在你的问题NewNoteActivity活动中提到将在这一步you have two activities in back stack

5.you推背stack.SO按下返回键,以便last activity will be destroy和你main activity will be resume但是你想去的主页屏幕。

所以你的问题是在下面的步骤,因为我从你的问题知道是

1,创建通知后,启动完成

二,主要活动将呼吁启动

3.you按主页按钮,所以主要活动将停止,但不会破坏

4.你点击状态栏上的通知,所以你的application will be resume,这样你就已经在你的后台堆栈中的主要活动和通知无线将会像你在你的问题中提到的一样创建新的活动NewNoteActivity活动将在此步骤推回栈.SOyou have two activities in back stack

5。您按下了按钮,以便last activity will be destroymain 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活动中按下后退按钮时,您的主要活动将调用onNewIntent()方法,因此在此方法中,您必须从NewNoteActivity活动中获取传递的标志变量。如果获得标志并且它是true,那么只需完成Main活动,你会得到主屏幕。

编辑

您是说您有任何从A,B或C的活性被打开时,您按下后退按钮,使本次活动将是closed.If你只在一个活动当时你的应用程序将被关闭意味着你将获得主屏幕。但是如果你有多个活动,并且你按下了按钮,你至少有一个活动在堆栈中,现在你点击通知,这将打开一个新的活动与您的通知相关联,以便此活动将推回栈上。现在,如果您按下后退按钮,与您的通知关联的最后一个活动将会关闭,如果您未修改该活动中的onBackPressed()方法vity然后它会检查回栈如果任何活动回栈,以便活动将恢复或如果没有活动回栈,那么你的应用程序将被关闭,你将得到主屏幕

+0

差不多这个......事情是,我没有主页活动,你误会了我。我的意思是我想回到主屏幕,桌面,在那里你有所有的壁纸的小部件... –

+0

我已经编辑我的答案,现在你可以检查它。 – Dharmendra

+0

这似乎可以工作,但它也看起来像一个肮脏的黑客。你说的全部都是有道理的,但我对这样的解决方案并不满意,我不会用它。但我相信它是有效的并解决了这个问题,所以我将它标记为已接受的答案。 –

3

有同样的问题。

android:taskAffinity=""

这基本上从主要活动的通知活动的亲和力分离等操作系统并不: 什么工作对我来说是清单中的下列属性被通知推出的活动设置感觉需要“返回”主要活动,但只是返回到之前的任何东西,例如“桌面”。

+0

不知道它是什么意思,但它完美的作品 – yasiriqbal776

19

谁还有可能需要回答。它看起来像这是你想达到的:

当你从通知开始Activity,你必须保留用户的预期导航体验。点击返回应该将用户带回应用程序的正常工作流程,进入主屏幕,并点击最近的应用程序应该将Activity显示为单独的任务。

http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

你的情况是 - Setting up a regular activity PendingIntent

见链接完整步骤。基本上你需要:
1.定义Activity层次结构AndroidManifest.xml中

<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堆栈启动该Activity

... 
Intent resultIntent = new Intent(this, ResultActivity.class); 
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
// Adds the back stack 
stackBuilder.addParentStack(ResultActivity.class); 
// Adds the Intent to the top of the stack 
stackBuilder.addNextIntent(resultIntent); 
// Gets a PendingIntent containing the entire back stack 
PendingIntent resultPendingIntent = 
     stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); 
... 
NotificationCompat.Builder builder = new NotificationCompat.Builder(this); 
builder.setContentIntent(resultPendingIntent); 
NotificationManager mNotificationManager = 
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
mNotificationManager.notify(id, builder.build()); 
+0

这是最好的答案 –

+0

当我点击通知并打开活动并转到我的主屏幕,然后几秒钟后,我发送了一个新通知I将不再收到通知。使用上面的代码可以帮助我。谢谢! – natsumiyu

0

它适合我。试试这个:

notifyIntent.setAction(Intent.ACTION_MAIN); 
notifyIntent.addCategory(Intent.CATEGORY_LAUNCHER); 
1

我在我的应用程序中使用这个解决方案。 覆盖onBackPressed(在您的活动从通知路由),并检查您的应用程序是否在堆栈中。如果没有,那么开始你的根活动。用户可以随时根据您的根活动进行导航。这就是我在我的应用程序中做的事情

@Override 
public void onBackPressed() { 
    if (isTaskRoot()) { 
     Intent intent = new Intent(this,YourMainActivity.class); 
     startActivity(intent); 
     super.onBackPressed(); 
    }else { 
     super.onBackPressed(); 
    } 
}