文档章节

Android Html 与客户端交互 ---- 1.)html 操作activity

SageHeaven
 SageHeaven
发布于 2016/10/11 11:50
字数 1085
阅读 12
收藏 0

1.何为 scheme和Uri

在Android中scheme是指Uri链接 :之前的部分如 test://login scheme 即为test。 可能很多人要为URI是怎么定义的呢?具体看URI的定义


  • 英文愿意: An identifier is an object that can act as a reference to something that has identity. In the case of URI, the object is a sequence of characters with a restricted syntax.
  • 翻译:一个具有参考对象的可以唯一识别的标识符。在这种情况下,这个对象在有限的语法表达出有序的符号

2.Uri 的结构

test://video:8080/event?title="scheme"&url="www.xiaomi.com"

  1. scheme :test
  2. host :video
  3. port:8080
  4. path :/event
  5. query : titile ,url

3. 如果通过H5(url) 来启动相应的页面(activity)

String url="test://video:8080/event?title="scheme"&url="www.xiaomi.com" "
Intent intent=new Intent(Intent.ACTION_VIEW,Uri.parse(url));
startActivity(intent);

<activity android:name=".UriActivity">
           <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:scheme="test" android:host="video" />
           </intent-filter>
 </activity>

这样就可以在UriActivity 中接收url 跳转相应的动作以及数据。

>  Uri data=getIntent().getData();
>      data.getScheme();
>      data.getHost();
>      data.getPort();
>      data.getPath();
>       data.getQueryParameter("title");

4.大量的不同的scheme跳转

如果我们在每个activity 中配置scheme ,host,path 显得特别麻烦。这个时候我们需要一个中转的activity来处理所有的scheme的跳转。根据相应的host,path 来跳转到相应的activity做进一步处理。

protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       Intent intent = getIntent();
       Uri data = intent.getData();
       String host = data.getHost();
       if(host.equals("list")){
          if ("/near".equals(data.getPath())) {//yhouse://list/near 
                intentTransfer = new Intent(this, NearbyActivity.class);
            } else if ("/new".equals(data.getPath())) {//yhouse://list/new 
                intentTransfer = new Intent(this, NewSkuActivity.class);
            } else if ("/live".equals(data.getPath())) {
                intentTransfer = new Intent(this, LiveActivity.class);
            } else if ("/neighbor".equals(data.getPath())) {
                intentTransfer = new Intent(this, NeighborActivity.class);
            } else if ("/talent".equals(data.getPath())) {
                intentTransfer = new Intent(this, TalentListActivity.class);
            } else if ("/guide".equals(data.getPath())) {
                intentTransfer = new Intent(this, GuideActivity.class);
            } else if ("/experience".equals(data.getPath())) {
                intentTransfer = new Intent(this, PlayerActivity.class);
            }else if ("/latest".equals(data.getPath())) {
                intentTransfer = new Intent(this, CikeActivity.class);
            } else if ("/message".equals(data.getPath())) {
                intentTransfer = new Intent(this, HomeActivity.class);
            } else if ("/message/like".equals(data.getPath())) {
                intentTransfer = new Intent(this, MessageDetailActivity.class);
            } else if ("/message/comment".equals(data.getPath())) {
                intentTransfer = new Intent(this, MessageDetailActivity.class);
            } else if ("/message/follow".equals(data.getPath())) {
                intentTransfer = new Intent(this, MessageDetailActivity.class);
            } else if ("/message/system".equals(data.getPath())) {
                intentTransfer = new Intent(this, SystemNoticeActivity.class);
            } else {
                intentTransfer = new Intent(this, HomeActivity.class);
            }
      }else if ("my-member".equals(host)) {
            intentTransfer = new Intent(this, MemberInfoActivity.class);
        } else if ("event".equals(host)) {
            intentTransfer = new Intent(this, HuodongDetailActivity.class);
        } else if ("booking-list".equals(host)) {
            intentTransfer = new Intent(this, OrderManagerActivity.class);
        } else if ("my-party".equals(host)) {
            intentTransfer = new Intent(this, OrderManagerActivity.class);
            intentTransfer.putExtra("type", OrderManagerActivity.PARTY);
        } else if ("order".equals(host)) {
            intentTransfer = new Intent(this, BookingManageDetailActivity.class);
        } else if ("meal".equals(host)) {
            intentTransfer = new Intent(this, MealDetailActivity.class);
        }
}

你可能发现大量的if else 语句不是非常好的选择。你可以采用swith case 看不起来更清爽一些。但是使用HashMap 将是我们比较好的选择。

HashMap处理 首发定义一个枚举 SchemeEnum和类SchemeManager

>``` public enum ShemeEnum {
>     Nearby("/near", NearbyActivity.class), NewSku("/new", NewSkuActivity.class),Live("/live", LiveActivity.class),
>     NeighborActivity("/neighbor", NeighborActivity.class),Talent("/talent", NeighborActivity.class),Guide("/guide", GuideActivity.class),
>     Player("/experience", PlayerActivity.class),News("/news", NewsActivity.class),Latest("latest",CikeActivity.class),
>             Message("/message",NeighborActivity.class),Like("/message/like",NeighborActivity.class),
>     Comment("/message/comment",NeighborActivity.class),Follow("/message/follow",NeighborActivity.class),
>     System("/message/system",NeighborActivity.class),event("event",HomeActivity.class);
>     private String key;
>     private Class<?> value;
> 
>     private ShemeEnum(String key, Class<?> value) {
>         this.value = value;
>         this.key = key;
>     }
> 
>     public String getKey() {
>         return key;
>     }
> 
>     public Class<?> getValue() {
>         return value;
>     }
> }

>```
>   public class SchemeManager {
>     private  static HashMap<String, Class> map = new HashMap();
>     private static SchemeManager scheme;
> 
>     public static HashMap initScheme() {
>         ShemeEnum[] values = ShemeEnum.values();
>         int len=values.length;
>         for (int i = 0; i <len ; i++) {
>             map.put(values[i].getKey(), values[i].getValue());
>         }
>         return map;
>     }
> 
>     public static HashMap<String, Class> getMap() {
>         return map;
>     }
> }

scheme 转化的Activity 将整理成

>```
>  public class UriActivity extends Activity {
>     private SApplication sApplication;
> 
>     @Override
>     protected void onCreate(Bundle savedInstanceState) {
>         super.onCreate(savedInstanceState);
>         setContentView(R.layout.activity_test);
>         Log.e("---UriActivity---", getClass().getName());
>         Uri data = getIntent().getData();
>         sApplication = (SApplication) getApplication();
>         Intent intent = getIntent();
>         if (intent == null || data == null) finish();
>         Intent intentTransfer = null;
>         String host = data.getHost();
>         if (host.equals("list")) {
>             intentTransfer = getIntentTransfer(data.getPath());
>         }   else {
>             intentTransfer = getIntentTransfer(host);
>         }
>         if (intentTransfer != null) {
>             intentTransfer.setData(data);
>             startActivity(intentTransfer);
>         }
>         finish();
>     }
> 
>     private Intent getIntentTransfer(String path) {
>         Object clazz = sApplication.getMap().get(path);
>         Intent intentTransfer;
>         if (clazz != null) {
>             intentTransfer = new Intent(this, (Class<?>) clazz);
>         } else {
>             intentTransfer = new Intent(this, HomeActivity.class);
>         }
>         return intentTransfer;
>     }
> }
> ``

感觉UriActivity 变的更简洁。每次新加scheme 只需要在对应的枚举中添加相应的scheme 和Activity名称既可以正常的跳转。

5. 拦截uri 跳转

如果你想在跳转的途中或者我直接操作相应的某个操作(显示弹框,去分享等等) 你首先要重写 WebViewClient shouldOverrideUrlLoading(WebView view, String url); 来实现拦截的目的。

  this.setWebViewClient(new WebViewClient() {
            String failedUrl;

        @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //TODO 判断是否要拦截。如果需要做你的拦截之后的动作。
                //不需要直接跳转(看第3条)。 
                return true;
            }
        });
    }
 
 

这样通过H5 来打开相应的activity并且传递参数的相关内容介绍完。下一节。我们将讲解Activity 传递给html 数据,以及调用相关的方法。

© 著作权归作者所有

SageHeaven
粉丝 0
博文 1
码字总数 1085
作品 0
沈阳
私信 提问
android WebView总结

浏览器控件是每个开发环境都具备的,这为马甲神功提供了用武之地,windows的有webbrowser,android和ios都有webview。只是其引擎不同,相对于微软的webbrowser,android及ios的webview的引擎...

迷途d书童
2012/03/28
8.5K
1
关于构想的移动web应用程序设计框架的思考

谈这个构想的移动web应用程序设计框架之前,要先谈谈web应用程序开发中的C/S和B/S,再谈谈jquery mobile,之后再谈谈现在已有的android UI开发工具。 一谈web应用程序开发中的C/S和B/S,在B...

egaotan
2014/05/06
183
0
通过WebView实现页面与ANDRIOD客户端的交互

为了减少由于手机客户端的变更而造成的客户端反复更新,还是决定采用WebView+页面的展示方式来作为最终的方案。也与一些做手机应用开发的一些朋友咨询过,大概也是采用类似的思路。 采用Web...

xubohui
2012/10/18
0
0
Android WebView与JS交互入门

首先在Anndroid代码中对WebView进行初始化 html的代码如下 WebView与js交互主要分四种情况 1、Android 调用HTML中的javascript脚本 2、HTML中的javascript脚本调用Android本地代码 3、Andro...

胡东月
2017/11/03
0
0
WebView深度学习(一)之WebView的基本使用以及Android和js的交互

前言:随着市场需求的不断变化,原生安卓已经无法满足客户的需要了,现在很多app都在使用Android和h5的交互实现某些功能,比如商品详情页,文章详情页面,商品点评页面,还有某些复杂的展示页...

aweiloveandroid
2017/07/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

线程池之ThreadPoolExecutor使用

ThreadPoolExecutor提供了四个构造方法: ThreadPoolExecutor构造方法.png 我们以最后一个构造方法(参数最多的那个),对其参数进行解释: public ThreadPoolExecutor(int corePoolSize, /...

天王盖地虎626
26分钟前
1
0
小程序登陆流程

http://www.bubuko.com/infodetail-2592845.html

为何不可1995
35分钟前
1
0
Consul+Spring boot的服务注册和服务注销

一图胜千言 先看一看要做事情,需要在Consul上面实现注册中心的功能,并以2个Spring boot项目分别作为生产者,消费者。 Consul 假设已经完成文章《Consul的开发者模式之Docker版》中的所有的...

亚林瓜子
41分钟前
4
0
MySQL高可用之基于Galera复制跨地域节点分布的滥用

mysql使用教程 MySQL高可用之基于Galera复制跨地域节点分布的滥用 2018-11-22 02:15 8335 85 让我们再一次讨论MySQL高可用性(HA)和同步复制。 它是地理上分布区域上一些高可用性参考架构解...

rootliu
51分钟前
1
0
js判断pc还是移动端

var pcyidong =/(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent); 如果pcyidong的值为false则用户的浏览器为pc端 如果pcyidong的值为true则用户浏览器为移动端 if (pcyidong =...

流年那么伤
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部