zoukankan      html  css  js  c++  java
  • 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" />
    <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");
                }
            }
            
        }
  • 相关阅读:
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(7)--XSLT列表视图web部件
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(6)--筛选器web部件
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(5)--库web部件
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(4)--基于视图的通知
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(3)--等级
    一步步学习微软InfoPath2010和SP2010--第十三章节--SharePoint视图和仪表板(2)--视图
    思考架构演进的主要驱动因素是什么?
    软件设计的一点理解
    从接触的代码进行源码阅读
    设计一个存储方案的存储结构的细节问题,需要考虑以下因素:
  • 原文地址:https://www.cnblogs.com/lovelyYakir/p/10363007.html
Copyright © 2011-2022 走看看