1. 程式人生 > >Android自定義URL使用Scheme方式喚起Activity或App

Android自定義URL使用Scheme方式喚起Activity或App


最近由於工作需要,使用Scheme方式自定義URL來跨應用間呼叫,踩了一些坑,現在記錄一下。

1、Scheme方式配置

manifest中配置能接受Scheme方式啟動的activity

<intent-filter>
       <action android:name="android.intent.action.VIEW"></action>  
       <category android:name="android.intent.category.DEFAULT"></category>
       <category android:name="android.intent.category.BROWSABLE"></category>   
       <data
            android:scheme="app"
            android:host="test">
       </data>  
</intent-filter>
如果需要配置能被js調起,一定要配置下面這句
<category android:name="android.intent.category.BROWSABLE"></category>

data配置的屬性:

android:scheme="app"表示配置接受的協議為app,相當於http://www.baidu.com中的http或者https
android:host="test"表示配置接受的域名為test,相當於http://www.baidu.com中的www.baidu.com

2、使用URL調起Activity
Uri uri=Uri.parse("app://test");
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);

3、使用js調起Activity

window.location = "app://test";  

4、實際使用中的一些小細節

當自定義的URL配置在LAUNCHER對應的Activity上時,上述配置就足夠了。

但是當自定義的URL配置在非LAUNCHER對應的Activity時,還需要增加額外幾步操作。

問題一:使用自定義的URL啟動Activity時,預設是已FLAG_ACTIVITY_NEW_TASK的方式啟動的,所以可能存在URL啟動的Activity跟應用已啟動的Activity不再同一個堆疊的現象。

解決方式:這種情況下,需要在manifest中將Activity多配置一個taskAffinity屬性,約束URL啟動的Activity與應用自身的啟動的Activity在同一個堆疊中。

問題二:應用A使用url的方式喚起應用B的Activity時,可能存在應用B的Activity啟動了,但是堆疊仍然在後臺的現象,即應用B的Activity沒有聚焦的問題。

解決方式:這種情況下,應用B的Activity收到啟動的請求後,可以主動將Activity對應的堆疊移動到最前端。

ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
activityManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_WITH_HOME);
使用這種方式需要注意的是該api是在Android 3.0(api 11)以後才提供的,現在基本上手機rom版本都是Android4.4以上了,就不太需要關注3.0一下怎麼處理了,且使用這個需要在manifest中申請android.permission.REORDER_TASKS許可權。