Android自定義URL使用Scheme方式喚起Activity或App
阿新 • • 發佈:2019-01-22
最近由於工作需要,使用Scheme方式自定義URL來跨應用間呼叫,踩了一些坑,現在記錄一下。
1、Scheme方式配置
manifest中配置能接受Scheme方式啟動的activity
如果需要配置能被js調起,一定要配置下面這句<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>
<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許可權。