深层链接和多个应用程序实例

我在我的应用程序中实现了深度链接。 我在清单文件中添加了这个意图filter,深层链接正在工作。

<intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.VIEW" /> <data android:host="www.mywebsite.com" android:pathPrefix="/something" android:scheme="http" /> </intent-filter> 

问题是,通过深度链接,我的应用程序正在当前应用程序的顶部启动。 如果我在Gmail中,然后点击了一个链接,那么我的应用程序将在Gmail上启动。 我想启动我的应用程序不同。

如果我的应用程序已经在后台运行,并且我点击了Gmail中的一个链接redirect到我的应用程序,我将同时运行两个应用程序的实例; 一个在后台,另一个在Gmail之上。 我想一次只运行我的应用程序的一个实例,所以它不在当前应用程序(Gmail)之上。 我怎样才能做到这一点?

Solutions Collecting From Web of "深层链接和多个应用程序实例"

接受的答案不适合我,这是做了什么:

 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); finish(); 

从官方文档:

如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是closures其上的所有其他活动,并将此Intent交付给(现在开启顶端)旧活动作为一个新的意图。

您需要在您的清单中为您的活动做以下事情。

 android:launchMode="singleTask" 

这告诉系统始终启动活动的现有实例,如果它已经创build。

然后你可以通过重写这个方法来处理这个Intent

 onNewIntent 

有关更多信息,请参阅http://developer.android.com/guide/topics/manifest/activity-element.html

那么我们有几个深层次的问题。 喜欢:

  1. 点击同一个链接两次,首先点击触发正确的视图
  2. 打开了多个实例
  3. whatsapp或facebook的链接在whatsapp本身打开了一个视图,因为他们的网页浏览器。
  4. 在Android 6上只打开一个实例,但只处理第一个意图,第二和第三个打开的​​应用程序,但没有行动,因为intentdata没有改变。

所以下面这个问题对于我们遇到的几个问题的全面解决scheme并不是一个明确的答案。

我们的scheme:

a)创build一个新的FragmentActivity

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); //well can be anything some "loading screen" Intent intent = getIntent(); String intentUrl = intent.getDataString(); Intent newIntent = new Intent(this, MainActivity.class); newIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); newIntent.putExtra("intentUrl",intentUrl); newIntent.setAction(Long.toString(System.currentTimeMillis())); startActivity(newIntent); finish(); } 

b)舱单:

  <activity android:name="YOUR.NEW.FRAGMENT.ACTIVITY" android:label="@string/app_name" android:launchMode="singleTop"> <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="http" /> <data android:scheme="https" /> <data android:scheme="scheme1" /> <!-- sheme1://--> <data android:host="yourdomain.com" /> <data android:host="www.yourdomain.com" /> </intent-filter> </activity> 

c)通过调用下面的示例函数来处理活动onCreate()和onResume()中传递的新意图:

 private void handleUrl(Intent i){ String intentUrl = null; if (i != null) { intentUrl = i.getStringExtra("intentUrl"); if (intentUrl == null){ //hmm intent is damaged somehow } else { //because of onResume() if ( i.getBooleanExtra("used",false) ) { return; } i.putExtra("used", true); //DO SOMETHING WITH YOUR URL HERE } } 

只解决这个问题只有一个实例

机器人:launchMode = “singleInstance”

 <activity android:name=".SplashScreen" android:screenOrientation="portrait" android:launchMode="singleInstance" android:theme="@style/Theme.AppCompat.Light.NoActionBar.FullScreen"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="nvd.abc" /> </intent-filter> </activity> 

我有这个完全相同的问题,除了我希望用户用完整的后退堆栈回到主要任务,好像他们刚刚使用应用程序切换器移动到我的应用程序。 要做到这一点,我不得不重新sorting任务。

1)给我的应用程序权限重新sorting的任务

 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.company.app"> <uses-permission android:name="android.permission.REORDER_TASKS"/> </manifest> 

2)跟踪任务ID是什么

 public class MainActivity { public static int mainTaskId; @Override protected void onCreate(Bundle savedInstanceState) { super(savedInstanceState); //set the main task ID taskId = getTaskId(); } } 

3)当我的深层链接活动启动时,保存一些数据供以后使用,然后把主要任务放在前面

 public class DeepLinkActivity { @Override protected void onCreate(Bundle savedInstanceState) { super(savedInstanceState); //persist deep link data Uri uri = intent.getData(); String action = intent.getAction(); saveForLater(uri, action); if(isTaskRoot()){ //I'm in my own task and not the main task final ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); activityManager.moveTaskToFront(MainActivity.taskId, ActivityManager.MOVE_TASK_NO_USER_ACTION); } } } } 

4)当主任务的后端堆栈开始的任何活动开始时,它检查是否有任何保存的数据可以工作,并在其上工作。