2016-10-12 28 views
2

我正在开发一个有2个启动方法的android应用程序。 按下手机上的应用程序图标即可正常使用。 另一种方法是从网站的深层链接。Android:最近开始不正确的活动

深度链接还发送应用程序需要做的一些“东西”的一些数据。但是,这应该只做一次。 深度链接活动完成后,开始主要活动。但是,当我按下(在设备上)并从最近打开应用程序时,它会再次打开深层链接活动。

我可以从清单中的最近值中排除深层链接活动。这也排除了最近的应用程序的主要活动,这不应该是这样。

如何防止从最近的应用程序开始的深度链接活动?

我的清单:

<activity 
     android:name="MainActivity" 
     android:label="@string/app_name" 
     android:screenOrientation="portrait" 
     android:launchMode="singleTask" 
     android:theme="@style/AppTheme"> 
    </activity> 

    <activity 
     android:name="DeeplinkActivity" 
     android:label="@string/app_name" 
     android:noHistory="true" 
     android:screenOrientation="portrait" 
     android:launchMode="singleTask" 
     android:theme="@style/AppTheme"> 

     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="app_name" android:host="test" /> 
     </intent-filter> 

     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:host="test" android:path="/" android:scheme="app_name" /> 
     </intent-filter> 
    </activity> 

要切换到我做了以下在MainActivity:

 Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 

编辑: 这个帖子被标记为与复制:Android: Starting app from 'recent applications' starts it with the last set of extras used in an intent

但是该职位是关于同样的活动。我想改变根活动,所以当我从最近开始的应用程序它不启动DeeplinkActivity。是的,作为解决方法我可以检查Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY标志。但是,每次用户从最近开始应用程序时,DeeplinkActivity都会打开,而不再需要它。

设置和或清除aditional意图值似乎不起作用。我使用getIntent()的信息getData()

如果你仍然觉得这是一个重复请解释。

+0

我重新提出了这个问题。 –

回答

1

你的问题是,无论是DeepLinkActivityMainActivity在同一个任务,所以当用户从最近的任务列表中选择应用程序,Android将要么把现有任务的前景,或者如果没有现成的任务(其中包含活动/活动活动),请启动Activity,它是最近一次任务中的根Activity。您无法预测哪个Activity将成为根Activity,因为任务可以从DeepLinkActivityMainActivity开始,具体取决于用户首先选择哪一个。

你真的需要有2个独立的任务来做到这一点。一项任务将包含您的DeepLinkActivity,并且此任务应排除在“最近的任务列表”之外。其他任务将包含您的MainActivity

我假设MainActivity<intent-filter>与ACTION = MAIN和CATEGORY = LAUNCHER,即使您张贴的清单不显示此。

你的表现应该是这样的:

<activity 
    android:name="MainActivity" 
    android:label="@string/app_name" 
    android:screenOrientation="portrait" 
    android:theme="@style/AppTheme"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

<activity 
    android:name="DeeplinkActivity" 
    android:label="@string/app_name" 
    android:noHistory="true" 
    android:screenOrientation="portrait" 
    android:taskAffinity="" 
    android:excludeFromRecents="true" 
    android:theme="@style/AppTheme"> 

    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:scheme="app_name" android:host="test" /> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:host="test" android:path="/" android:scheme="app_name" /> 
    </intent-filter> 
</activity> 

你绝对不需要为launchMode="singleTask"MainActivity你可能不需要它DeepLinkActivity要么(这取决于你做些什么与此)。

指定taskAffinity=""确保DeepLinkActivity没有射入相同的任务MainActivity,并允许您从DeepLinkActivity在一个单独的任务启动MainActivity。注意:如果没有指定taskAffinity,那么两个活动都将在相同的任务中结束,即使您为两个活动指定了launchMode="singleTask"也是如此。

DeepLinkActivity上指定excludeFromRecents="true"告诉Android,具有DeepLinkActivity作为其根活动的任务不应出现在最近的任务列表中。

当您启动从DeepLinkActivityMainActivity,你应该这样做:

Intent intent = new Intent(this, MainActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(intent); 

,并确保您在DeepLinkActivity调用finish()

如有必要,您还可以将noHistory="true"添加到DeepLinkActivity,但我不认为这是必要的。如果用户在DeepLinkActivity并接到来电,则在电话结束后,应显示DeepLinkActivity。如果您指定noHistory="true",则当用户接受来电时,将立即完成DeepLinkActivity

让我知道这是否清晰,适合您。

+1

谢谢你的维修人员。事实上,这是解决我的问题的方法。作为一个小方面的说明。 – remcoj

+0

对我来说它需要使用noHistory。因为在你的例子中有一个电话。当用户返回到应用程序时,进程需要重新启动。 – remcoj