網上對於安卓DeepLink方式跳轉傳遞參數的例子較少,說的也不客觀,實踐之后發現還是有一些坑。其實為什么要用DeepLink方式跳轉,有些是因為引流的原因,他們希望通過網頁就能直接跳轉到App的界面。還有其實就是某些業務的需要,需要統一跳轉方式,方便維護代碼。如果不知道DeepLink是什么,可以自行百度一下,下面介紹一下實際的用法:
接收參數方:
1.跳轉的App需要在清單文件注冊以下是例子:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.alex.deeplinkproject"> <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <!--url跳轉格式為:open://app.test.com/game--> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="open" android:host="app.test.com" android:pathPrefix="/game" /> </intent-filter> </activity> </application> </manifest>
通過三個字段生成一個URL:scheme://host pathPrefix 如上:open://app.test.com/game
2 需要接收的參數通過Uri獲取
//通過Deeplink 跳轉獲取參數
String action = getIntent().getAction();
if (Intent.ACTION_VIEW.equals(action)) { Uri data = getIntent().getData(); if (data != null) { String appId = data.getQueryParameter("appId"); String token = data.getQueryParameter("token"); String extend = data.getQueryParameter("extend"); String merchant = data.getQueryParameter("merchant"); String agent = data.getQueryParameter("agent"); }
發送參數方(以下代碼比較簡單使用Kotlin編寫):
1.需要傳遞對應的參數而后拼接到Uri后面,以下是例子
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) findViewById<Button>(R.id.bt1).setOnClickListener { val intent = Intent(Intent.ACTION_VIEW, Uri.parse("open://app.test.com/game?appId=com.game.sid21&token=21token&extend=21extend&merchant=21merchant&agent=21agent")) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) startActivity(intent) } } }
類似GET請求已Key=Value的形式傳遞。注意,Uri.parse 中的參數不可用+號進行拼接會出現無法獲取參數的情況。跳轉到其他App采用開啟新的棧方式,避免誤認為是一個App。
以上就是一個完整的跳轉流程代碼,但是實際上,當被跳轉的App已經啟動的時候我們有時候會取不到數據,但是跳轉是正常的跳轉了。這邊要注意我們使用的flag,當被啟動的App已經啟動,他會在onNewIntent()返回我們的正確的Intent而不是getIntent()了。你需要重寫此方法獲取最新的Intent。最好抽取一個方法出來,在onCreate()和onNewIntent()中都獲取Intent()。如下:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //通過Deeplink 跳轉獲取參數 getIntentData(getIntent()); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); getIntentData(intent); } private void getIntentData(Intent intent){ String action = intent.getAction(); if (Intent.ACTION_VIEW.equals(action)) { Uri data = getIntent().getData(); if (data != null) { String appId = data.getQueryParameter("appId"); String token = data.getQueryParameter("token"); String extend = data.getQueryParameter("extend"); String merchant = data.getQueryParameter("merchant"); String agent = data.getQueryParameter("agent"); } } }