2012-08-31 62 views
16

当我从通知中启动应用程序时,我的某个应用程序出现问题。它从不出现在“最近的应用”列表中。从通知中启动应用程序将其从最近的应用程序历史中删除

没有通知,每件事情都按预期工作:我启动应用程序,导航到当我退出它(带有主页按钮或返回按钮)之后,我可以通过长按Home键重新进入它=>好。

当我收到通知时,问题就开始了。如果我从通知中启动应用程序,它会启动正确的屏幕,我可以使用应用程序=>确定。但是,当我退出应用程序(使用家庭或后退按钮)时,它不会再出现在“最近的应用程序”列表中。更确切地说:

  • 如果应用程序存在于从通知启动应用程序之前,“最近的应用程序”列表中,它会删除它
  • 如果应用程序是不存在的“最近的应用程序”列表中,它不添加它

下面,我原来的代码中添加通知状态栏:

mNotification = new Notification(R.drawable.ic_notif, message, System.currentTimeMillis()); 
mNotification.flags |= Notification.FLAG_AUTO_CANCEL; 

Intent notificationIntent = new Intent(Intent.ACTION_VIEW,Uri.parse(link)); 
notificationIntent.putExtra(...); 

PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 
mNotification.setLatestEventInfo(context, context.getString(R.string.app_name), message, contentIntent); 
notificationManager.notify(ConfigApp.NOTIFICATION_ID, mNotification); 

我尝试添加一个FLAG_ACTIVITY_NEW_TASK但它并没有帮助:

Intent notificationIntent = new Intent(Intent.ACTION_VIEW,Uri.parse(link)); 
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
notificationIntent.putExtra(...); 

被通知开始活动的舱单申报:

<activity 
    android:name=".activity.ActivityMessages" 
    android:label="" 
    android:windowSoftInputMode="stateHidden"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data 
      android:host="hostapp" 
      android:pathPrefix="/prefixapp" 
      android:scheme="schemeapp" /> 
    </intent-filter> 
</activity> 

有谁知道如何保持应用程序中的“最近的应用程序”列表正在启动形成的通知后?

+0

什么Android版本出现这种情况呢? –

+0

如果删除'',会发生什么?另外,请尝试删除entier'intent-filter'组。 – Eric

+0

@ WebnetMobile.com每个版本自2.2 –

回答

7

将动作android.intent.action.MAIN和类别android.intent.category.LAUNCHER添加到您的活动规范中。有两个动作和类别看起来像一个黑客,但它是actually supported by Android

<activity 
    android:name=".activity.ActivityMessages" 
    android:label="" 
    android:windowSoftInputMode="stateHidden"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     <data 
      android:host="hostapp" 
      android:pathPrefix="/prefixapp" 
      android:scheme="schemeapp" /> 
    </intent-filter> 
</activity> 

这应该将其添加到最近的应用程序列表中。究其原因,在Android developer documentation描述:

这种意图过滤器会导致要显示在应用程序启动的 活动,给用户推出的活动,并返回 方式的图标和标签到任务它在任何时候启动后创建 。

第二个能力很重要:用户必须能够离开任务 ,然后使用此活动启动器稍后再回来。 对于这个 原因,标志着活动一如既往启动 任务,“singleTask”和“” singleInstance”两种启动模式,只应使用时 活动有ACTION_MAIN和CATEGORY_LAUNCHER过滤器。 想象一下,例如,如果过滤器丢失会发生什么情况: 意图启动一个“singleTask”活动,启动一项新任务,并且 用户花费一些时间在该任务上工作,然后用户按下主屏幕按钮 。现在发送到后台并且不是 可见。现在用户无法返回任务,因为它在应用程序启动器中未显示为 。

+0

我已将新操作和新类别添加到清单中=>无变化。我也尝试用以下数据改变Intent的创建,但不是更好:'notificationIntent.setAction(Intent.ACTION_MAIN);'\t'notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);'\t'notificationIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); ' 因此,它应该开始一项新的任务,但它不是。 –

+0

尝试将'android:launchMode'设置为'singleTop'。我读过其他人的尝试,并使其工作。如果没有 - 这可能是Android中的一个错误。 – Nicholas

+0

不幸的是,它没有工作 –

0

尝试添加到清单如下:

android:excludeFromRecents = "false" 

祝你好运, 路易斯

+0

这是文档中指定的默认值:http://developer.android.com/guide/topics/manifest/activity-element。html#exclude –

+0

@ol_v_er我知道这是默认设置,但正如你所说的那样,从通知开始的应用程序不会将事件注册在最近的历史记录中,因此通知可能会将此标志添加到开始意图的值为true,这个测试会检查你是否可以覆盖它,如果是这样的话。祝你好运 – Luis

0

您需要使用单独的Intent Filters每个动作/类别配对:

<activity 
    android:name=".activity.ActivityMessages" 
    android:label="" 
    android:windowSoftInputMode="stateHidden"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data 
      android:host="hostapp" 
      android:pathPrefix="/prefixapp" 
      android:scheme="schemeapp" /> 
    </intent-filter> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
     <data 
      android:host="hostapp" 
      android:pathPrefix="/prefixapp" 
      android:scheme="schemeapp" /> 
    </intent-filter> 
</activity> 
+0

即使分离不同的意图过滤器,它不起作用 –

+0

嗯......它可能需要该标签属性集。你尝试过'android:label =“@ string/app_name”'? – Phil

0

我遇到了同样的问题。问题是我的活动有android:label =“”。当我从通知中打开活动时,它会用当前的活动替换应用任务中的根活动。并且Android从最近期内排除具有空标签的活动(请参阅source code)。

要隐藏活动的标题,你应该使用:

getActionBar().setDisplayShowTitleEnabled(false); 
0

老话题,但我发现解决方案(我不能在网上找到的人),也许这将是对某人有帮助。它不可能将任何活动设置为父项,但我认为(不确定)是否可以通过编程方式(在OpenFromNotificationActivity中)更改它(如果有必要)。

在清单

<activity android:name=".OpenFromNotificationActivity" 
      android:label="@string/label"> 
      <meta-data 
      android:name="android.support.PARENT_ACTIVITY" 
      android:value=".StartSplashActivity" /> 
</activity> 

<activity android:name=".StartSplashActivity" 
      android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
</activity> 
0

检查从通知

if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) 
相关问题