Android 通过自定义 scheme 协议来实现 Web 页面启动原生 APP

应用场景分析

当我们在浏览器中打开某些网页,有时候会发现它有一个功能是可以实现吊起手机中已安装的某个 APP,像我们在浏览器打开 csdn 的一篇博客,或者在浏览器打开知乎的一篇文章时,都会有一个类似去APP阅读的按钮。

这篇文章就来实现这个功能。

实现、效果演示

  • 第一步,新建工程
    除了默认的 MainActivity 之外,再创建一个 Activity(名字随意,我这里使用 SchemeActivity) 用来被 Web 链接特定跳转。
  • 第二步,配置 AndroidManifest.xml
	<activity android:name=".MainActivity">
        <intent-filter>
             <action android:name="android.intent.action.MAIN" />
             <action android:name="android.intent.action.VIEW" />

             <category android:name="android.intent.category.LAUNCHER" />
         </intent-filter>

         <!--避免桌面没有图标,所以多添加一个 intent-filter-->
         <intent-filter>
             <data
                 android:host="myapp.host"
                 android:pathPrefix="/openwith"
                 android:scheme="myappscheme" />
             <action android:name="android.intent.action.VIEW" />

             <category android:name="android.intent.category.DEFAULT" />
             <category android:name="android.intent.category.BROWSABLE" />
         </intent-filter>
     </activity>

     <activity android:name=".SchemeActivity" />
  • 第三步,运行程序到手机,并在手机自带浏览器输入如下链接,并搜索即可
myappscheme://myapp.host/openwith
  • 第四步,查看效果如下:
    浏览器吊起APP

实现吊起并打开特定页面
在前面 4 步的基础上我们要是实现这个功能,需要在 MainActivity 中加入如下代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = getIntent();
        if (null != intent) {
            Uri uri = intent.getData();
            if (null != uri) {
                Log.e("uri-->", "" + uri.getScheme()
                        + "-path->" + uri.getPath()
                        + "-params1->" + uri.getQueryParameter("params1"));
                if ("schemeAct".equals(uri.getQueryParameter("params1"))) {
                    Intent intent1 = new Intent(MainActivity.this, SchemeActivity.class);
                    startActivity(intent1);
                }
            }
        }
    }

}

修改我们的访问地址,加上参数,如下:

myappscheme://myapp.host/openwith?params1=schemeAct

效果展示:

带参数启动特定页面
这样我们的功能就已经基本 Ok 了。

优缺点说明

  • 细心的读者可能注意到了,我在前面提高了使用系统自带的浏览器打开,这是因为有个别浏览器本身不支持,比如:UC,猎豹,对于这种情况,我们没有好的办法。
  • 如果我们的功能是通过分享到微信,然后在微信中打开 Web 链接,这个时候我们的功能是会失效的,因为微信自己的内嵌浏览器是有白名单限制的。
  • 大多数浏览器都是支持的,代码量很少,也可以节约开发成本。

总结

  1. 前面的清单文件注册,需要放到默认启动的 Activity 下,这一点很多博客没有提及到。
  2. 点击后如果手机没有安装对应的 APP,那么这个判断和后面的逻辑是在网页端处理的。
发布了68 篇原创文章 · 获赞 210 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/wufeng55/article/details/88089638