处理系统浏览器的发起的Intent事件

0x00

有时候你会发现,用Android系统自带的浏览器(chrome)打开一个web页面,如果安装了相应的App,就会自动打开这个App并进入具体的界面中,比如手机上打开:

https://www.zhihu.com/openinapp_instruction?app-id=432274380&app-argument=zhihu://questions/24122524

如果我们安装了知乎手机客户端,这个时候会自动打开知乎手机客户端,并且进入问题展示界面。还比如网易云音乐,今日头条等等App都是支持这个功能的。之前我们自家App的分享都是打开一个App介绍的界面,即使安装了手机客户端,也不会自动打开手机客户端。为了追求更好的体验,我们需要实现这个功能。

0x01 Chrome浏览器

研究这个功能,还是查阅了不少资料,比如 app link、deep link、chrome browser等等,如果紧紧是实现上面介绍的功能,还是 so easy的,仅仅需要了解 Chrome 浏览器 创建 Intent 的方法即可。

Chrome构造一个 Intent 的基本语法如下:

intent:
   HOST/URI-path // Optional host
   #Intent;
      package=[string];
      action=[string];
      category=[string];
      component=[string];
      scheme=[string];
   end; 

根据上面的语法,我们来看一个demo:

intent:
   //article/51348656
   #Intent;
      package=com.ttdevs.android;
      scheme=ttdevs;
   end; 

可以使用下面的 html 代码触发这个事件:

<a href="intent://article/51348656/#Intent;scheme=ttdevs;package=com.ttdevs.android;end">ttdevs</a>

另外还有个参数:

S.browser_fallback_url=[encoded_full_url]

介绍如下(不过我没搞明白):

When an intent could not be resolved, or an external application could not be launched, then the user will be redirected to the fallback URL if it was given.

Some example cases where Chrome does not launch an external application are as follows:

- The intent could not be resolved, i.e., no app can handle the intent.

- JavaScript timer tried to open an application without user gesture.

Note that S. is a way to define string extras. S.browser_fallback_url was chosen for backward compatibility, but the target app won’t see browser_fallback_url value as Chrome removes it.

0x02 App内处理浏览器发来的Intent

通过上面的介绍,如果我们点击链接,就会触发一个 Intent,有了Intent,我们还需要来处理它。在 AndroidManifest.xml 中相应的 Activity 中的配置中添加如下filter:

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

    <data android:host="article" android:pathPattern="/.*" android:scheme="ttdevs"/>
</intent-filter>

同时在Activity中处理Intent:

public class RouterActivity extends BaseActivity {

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

        handleIntent(getIntent());
    }

    private void handleIntent(Intent intent) {
        String action = intent.getAction();
        String data = intent.getDataString();
        LogUtils.debug(action);
        LogUtils.debug(data);
    }
}

运行上面的代码,同时用系统浏览器打开上面的html,点击链接,即可调起我们的app。或者也可以通过下面的adb命令触发:

adb shell am start -a android.intent.action.VIEW -c android.intent.category.BROWSABLE -d "ttdevs://article/12345" com.ttdevs.android

在我的设备(魅族MX4 Pro)上,如果没有安装处理这个 Intent 的App,则会打开系统自带的应用市场。

对于一个提供查询食物数据的App,如果我们分享出去的食物信息带上了相关的参数,在用户点击分享链接时,如果安装了我们的App则可以跳到App中展示食物的界面,如果没有安装,则会跳到应用市场下载,很好的逻辑~~



参考:

https://developer.chrome.com/multidevice/android/intents

时间: 2024-10-14 00:58:46

处理系统浏览器的发起的Intent事件的相关文章

Android 打电话,发短信,调用系统浏览器

打电话: Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086")); startActivity(intent); 发短信: SmsManager smsManager=SmsManager.getDefault();//取得短信管理器 /**发简单的文本信息 * destinationAddress: 目标地址,发给谁 * scAddress: 来源的地址,谁发的 *

调用系统浏览器访问

如题目所示,直接调用系统浏览器访问网页. package com.example.deemo; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; public class MainActivity extends Activity { private String url="http://www.bilibili.com&quo

Android4.4系统浏览器Chromium实现的加载模块与流程

本文只描述Http网络请求相关的信息,Https.Spdy.file.ftp.websocket等的类型只提及在哪里出现关系分支. 代码层次图如下: +----------------------------------------+ |   WebView.java (SDK public API)   | +----------------------------------------+ |     Android & Chromium Wrapper       | Java桥接和封装层

五,事件对象、阻止浏览器默认动作、阻止事件冒泡

在jquery里边: $().bind(‘click’,function(evt){ evt.preventDefault(); evt.stopPropagation(); }); preventDefault()方法是jquery的方法,名字与js底层代码的名字一致而已. 并且其有做浏览器兼容处理(阻止浏览器默认行为) stopPropagation()方法是jquery的方法,名字与js底层代码的名字一致. 其有做浏览器兼容处理(阻止事件冒泡) 解析: $().bind(‘click’,f

c#控制IE浏览器自动点击等事件WebBrowser,mshtml.IHTMLDocument2 .

c#控制IE浏览器自动点击等事件WebBrowser,mshtml.IHTMLDocument2 分类: c# 2013-02-06 15:18 3008人阅读 评论(0) 收藏 举报 可以实现例如通过应用程序操作google搜索,用户输入要搜索的内容,然后在google中搜索:可以自动点击网页上的按钮等功能 1. 加入对Microsoft Internet Controls的引用:    2. 加入对Microsoft HTML Object Library的引用: (要引入Microsoft

JS 阻止浏览器默认行为和冒泡事件

JS 冒泡事件 首先讲解一下js中preventDefault和stopPropagation两个方法的区别: preventDefault方法的起什么作用呢?我们知道比如<a href="http://www.baidu.com">百度</a>,这是html中最基础的东西,起的作用就是点击百度链接到http://www.baidu.com,这是属于<a>标签的默认行为,而preventDefault方法就是可以阻止它的默认行为的发生而发生其他的事情

webview loadUrl() 弹出系统浏览器解决办法

有很多时候,我们请求的网站会直接跳转到一个位置,这样会直接全屏浏览器加载被跳转的网页,或者弹出浏览器选择(除了系统的,你还自己安装了其他浏览器). 于是解决办法的原理就是,在webview中跳转. 办法一: mywebView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { //重写此方法表明点击网页里面的链接 //还是在当前的we

解决WebView加载URL跳转到系统浏览器的问题

1.问题 webview加载url跳转到系统浏览器,用户体验非常的差 2.解决方法 重写WebViewClient的shouldOverrideUrlLoading(WebView view, String url)使用view.loadUrl(url);加载url WebView webView= (WebView) findViewById(R.id.webView); webView.getSettings().setJavaScriptEnabled(true); webView.loa

Android系统用于Activity的标准Intent

1 根据联系人ID显示联系人信息 [java] view plain copy Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW);   //显示联系人信息 intent.setData(Uri.parse("content://contacts/people/492")); startActivity(intent); 2 根据联系人ID显示拨号面板 [java] view plain copy Int