Android通过DeepLink方式跳转其他App传递参数

   网上对于安卓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" /><applicationandroid: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" /><dataandroid: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");             }         }              }
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信