Android自定義URL使用Scheme方式喚起Activity或App
最近由于工作需要唯卖,使用Scheme方式自定義URL來跨應(yīng)用間調(diào)用黍瞧,踩了一些坑尚困,現(xiàn)在記錄一下掏膏。
1劳翰、Scheme方式配置 manifest中配置能接受Scheme方式啟動(dòng)的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可調(diào)用,需要添加這句:
<category android:name="android.intent.category.BROWSABLE">category>
data配置的屬性:
1. android:scheme="app"表示配置接受的協(xié)議為app馒疹,相當(dāng)于http://www.baidu.com中的http或者h(yuǎn)ttps
2. android:host="test"表示配置接受的域名為test佳簸,相當(dāng)于http://www.baidu.com中的www.baidu.com
2、使用URL調(diào)起Activity
Uri uri=Uri.parse("app://test");
Intent intent=new Intent(Intent.ACTION_VIEW,uri);
startActivity(intent);
3颖变、使用js調(diào)起Activity
window.location = "app://test";
4生均、實(shí)際使用中的一些小細(xì)節(jié)
當(dāng)自定義的URL配置在LAUNCHER對應(yīng)的Activity上時(shí)听想,上述配置就足夠了。
但是當(dāng)自定義的URL配置在非LAUNCHER對應(yīng)的Activity時(shí)疯特,還需要增加額外幾步操作哗魂。
問題一:使用自定義的URL啟動(dòng)Activity時(shí)肛走,默認(rèn)是已FLAG_ACTIVITY_NEW_TASK的方式啟動(dòng)的漓雅,所以可能存在URL啟動(dòng)的Activity跟應(yīng)用已啟動(dòng)的Activity不再同一個(gè)堆棧的現(xiàn)象。
解決方式:這種情況下朽色,需要在manifest中將Activity多配置一個(gè)taskAffinity屬性邻吞,約束URL啟動(dòng)的Activity與應(yīng)用自身的啟動(dòng)的Activity在同一個(gè)堆棧中。
android:launchMode="singleTask"
問題二:應(yīng)用A使用url的方式喚起應(yīng)用B的Activity時(shí)葫男,可能存在應(yīng)用B的Activity啟動(dòng)了抱冷,但是堆棧仍然在后臺(tái)的現(xiàn)象,即應(yīng)用B的Activity沒有聚焦的問題梢褐。
解決方式:這種情況下旺遮,應(yīng)用B的Activity收到啟動(dòng)的請求后,可以主動(dòng)將Activity對應(yīng)的堆棧移動(dòng)到最前端盈咳。
1. ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
2. activityManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_WITH_HOME);
使用這種方式需要注意的是該api是在Android 3.0(api 11)以后才提供的耿眉,現(xiàn)在基本上手機(jī)rom版本都是Android4.4以上了,就不太需要關(guān)注3.0一下怎么處理了鱼响,且使用這個(gè)需要在manifest中申請android.permission.REORDER_TASKS權(quán)限鸣剪。