Android 模块化的路 模块间通信

2、签到效果的兑现拍卖

其实签到,都得以于微信公众号及商社号实现,微信的庄号可能实现再尽善尽美有,不过她们用JSSDK的接口操作是平的,我们得以展开过去就得了。这里介绍微信公众号JSSDK实现签到的功能处理。

登录的功效,我们期待记录用户的GPS位置信息,还有就是是下拍摄效果,拍一个像以上传到服务器,这样咱们虽可以兑现通业务功能了。

率先我们来统筹签到的界面,代码和功能如下所示。

葡京签到送彩金 1

界面预览效果如下所示:

葡京签到送彩金 2

咱来探微信JSSDK里面对【获取地理位置接口】的征:

wx.getLocation({
    type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
    success: function (res) {
        var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
        var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
        var speed = res.speed; // 速度,以米/每秒计
        var accuracy = res.accuracy; // 位置精度
    }
});

和图片接口里面【拍照或由手机相册中选图接口】的认证:

wx.chooseImage({
    count: 1, // 默认9
    sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
    sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
    success: function (res) {
        var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
    }
});

上传图片及微信服务器接口如下所示。

wx.uploadImage({
    localId: '', // 需要上传的图片的本地ID,由chooseImage接口获得
    isShowProgressTips: 1, // 默认为1,显示进度提示
    success: function (res) {
        var serverId = res.serverId; // 返回图片的服务器端ID
    }
});

备注:上传图片有效期3上,可用微信多媒体接口下充斥图片及好的服务器,此处获得的
serverId 即 media_id。

据悉这几个接口,我们来针对它进行打包,以贯彻我们的政工要求。根据我们的要,我们针对JSSDK接口进行了调用,如下所示。

    <script language="javascript">
    var appid = '@ViewBag.appid';
    var noncestr = '@ViewBag.noncestr';
    var signature = '@ViewBag.signature';
    var timestamp = '@ViewBag.timestamp';

        wx.config({
            debug: false,
            appId: appid, // 必填,公众号的唯一标识
            timestamp: timestamp, // 必填,生成签名的时间戳
            nonceStr: noncestr, // 必填,生成签名的随机串
            signature: signature, // 必填,签名,见附录1
            jsApiList: [
               'checkJsApi',
               'chooseImage',
               'previewImage',
               'uploadImage',
               'downloadImage',
               'getNetworkType',
               'openLocation',
               'getLocation'
            ]
        });

        wx.ready(function () {
            wx.getLocation({
                type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
                success: function (res) {
                    var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
                    var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
                    var speed = res.speed; // 速度,以米/每秒计
                    var accuracy = res.accuracy; // 位置精度
                    $("#lblLoacation").text(latitude + "," + longitude);

                    //解析坐标地址
                    var location = latitude + "," + longitude;
                    $.ajax({
                        type: 'GET',
                        url: '/JSSDKTest/GetAddress?location=' + location,
                        //async: false, //同步
                        //dataType: 'json',
                        success: function (json) {
                            $("#lblAddress").text(json);
                        },
                        error: function (xhr, status, error) {
                            $.messager.alert("提示", "操作失败" + xhr.responseText); //xhr.responseText
                        }
                    });
                }
            });
            wx.getNetworkType({
                success: function (res) {
                    var networkType = res.networkType; // 返回网络类型2g,3g,4g,wifi
                    $("#lblNetwork").text(networkType);
                }
            });

            chooseImage();
        });
    </script>

中间的chooseImage()是我们当页面开始之早晚,让用户拍摄的操作,具体JS代码如下所示。

        //拍照显示
        var localIds;
        function chooseImage() {
            wx.chooseImage({
                count: 1, // 默认9
                sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有
                sourceType: ['camera'], // 可以指定来源是相册还是相机,默认二者都有
                success: function (res) {
                    localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片
                    $("#imgUpload").attr("src", localIds);
                }
            });
        }

而用户以摄像头拍后,就会回去一个res.localIds集合,因为我们拍摄一个,那么得将她一直赋值给图片对象,让其显示当前拍的图形。

拍就,我们单击【签到】应该把图纸以及相关的坐标等消息及传到服务器的,图片首先是保留于微信服务器的,上传图片有效期3龙,可用微信多媒体接口下充斥图片及好的服务器,此处获得的
serverId 即 media_id。

为了落实我们团结一心的事体数据,我们需要将图纸集相关信息存储于好的服务器,这样才得兑现信息之保留,最后提醒【签到操作成】,具体过程如下所示。

        //上传图片
        var serverId;
        function upload() {
            wx.uploadImage({
                localId: localIds[0],
                success: function (res) {
                    serverId = res.serverId;

                    //提交数据到服务器

                    //提示信息
                    $.toast("签到操作成功");
                },
                fail: function (res) {
                    alert(JSON.stringify(res));
                }
            });
        }

另外,我们为了兑现单击图片控件,实现重复拍照的操作,以及签到的事件处理,我们对控件的单击处理进行了绑定,如下代码所示。

        document.querySelector('#imgUpload').onclick = function () {
            chooseImage();
        };

        $(document).on("click", "#btnSignIn", function () {
            if (localIds == undefined || localIds== null) {
                $.toast('请先拍照', "forbidden");
                return;
            }
            //调用上传图片获得媒体ID
            upload();
        });

葡京签到送彩金 3

使对这个《C#开微信门户及以》系列感兴趣,可以关心自我的旁文章,系列随笔如下所示:

C#付出微信门户及采取(39)–使用微信JSSDK实现签到的效力

C#出微信门户及利用(38)–微信摇一摆红包功能

C#支出微信门户及用(37)–微信公众号标签管理职能

C#开发微信门户及动(36)–微信卡劵管理的包操作

C#开微信门户及采取(35)–微信支付的局会封装操作

C#支出微信门户及应用(34)–微信裂变红包

C#开发微信门户及运用(33)–微信现金红包的包装及用

C#开微信门户及动(32)–微信支付接入和API封装使用

C#付出微信门户及采取(31)–微信语义理解接口的落实和处理

C#出微信门户及利用(30)–信息之群发处理与预览功能

C#支出微信门户及用(28)–微信“摇一摇·周边”功能的使与接口的兑现

C#出微信门户及下(27)-公众号模板消息管理 

C#支付微信门户及使用(26)-公众号微信资料管理

C#付出微信门户及运用(25)-微信企业号的客户端管住力量

C#开微信门户及以(24)-微信小店货架信息保管

C#支出微信门户及下(23)-微信小店商品管理接口的包和测试

C#开发微信门户及应用(22)-微信小店的出以及使用

C#支付微信门户及运用(21)-微信企业号的音讯及事件的接纳处理与解密 

C#开发微信门户及下(20)-微信企业号的菜谱管理

C#支付微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文信息等)

C#开微信门户及以(18)-微信企业号的通讯录管理支出之成员管理

C#付出微信门户及使用(17)-微信企业号的通讯录管理支出的部门管理

C#开微信门户及运用(16)-微信企业号的配置与运

C#付出微信门户及动(15)-微信菜单增加扫一扫、发图、发地理位置功能

C#支付微信门户及使用(14)-在微信菜单中行使重定向获用户数量

C#开发微信门户及运用(13)-使用地理位置扩展相关以

C#开微信门户及动(12)-使用语音处理

C#支出微信门户及采取(11)–微信菜单的余表现方式介绍

C#出微信门户及应用(10)–在治本网遭到共同微信用户分组信息

C#支出微信门户及用(9)-微信门户菜单管理及交至微信服务器

C#出微信门户及下(8)-微信门户应用管理网机能介绍

C#支付微信门户及使用(7)-微信多客服功能及开销并

C#付出微信门户及运用(6)–微信门户菜单的管理操作

C#出微信门户及以(5)–用户分组信息保管

C#支付微信门户及下(4)–关注用户列表及详细信息管理

C#开发微信门户及使用(3)–文本消息及图文信息的应

C#开微信门户及运用(2)–微信信的处理和应对

C#付出微信门户及以(1)–开始动微信接口

 

其三、模块间调用思路及方案

模块间调用思路

一旦是WEB开发,对外宣称接口,自己事情去落实接口,再爆出接口去调用具体事情的实现。

设若齐图所示,购物车模块对外提供简单单服务:getCartCount 和 addToCart
,产品页面需要出示时用户购物车的多寡,以及将产品丰富到买入物车,那产品模块因为依靠了
ServiceCart,可以取得CartService的接口声明定义。

只是怎么抱CartService的实例呢?

自我信任CartService的实例一定是世界有地方,等自己失去发现。

当今模块化架构就改为如下图:

增加Service层

设齐图,我们多了一个Service层,这个Service层虽然写于了Common层上面,但连无依赖Common。

这会儿,我们若缓解的即是 CartService 之我要是找到您了!

1、JSSDK的说明

微信JS-SDK是微信公众平台面向网页开发者提供的依据微信内的网页开发工具包。通过下微信JS-SDK,网页开发者可依靠微信高效地运用摄影、选图、语音、位置等手机系统的力,同时可以直接使用微信分享、扫一扫、卡券、支付相当于微信特有的能力,为微信用户提供更优质的网页体验。

时下JSSDK支持之接口分类包括下面几乎近似:基础接口、分享接口、图像接口、音频接口、智能接口、设备信息、地理位置、摇一摇周边、界面操作、微信扫一扫、微信小店、微信卡券、微信支付,随着微信作用的百分之百重组,估计再多的接口会陆续开放出来。

当微信的后台进入【开发者文档】模块,我们可见到相应的JSSDK的力量分类以及介绍,如下所示。

葡京签到送彩金 4

起右边我们好详细察看各个接口的运用说明,基本上JSSDK的行使方法还接近,因此调试通过并操纵之中一两独,其他的呢就是抄,照在做就可了。

1)JSSDK使用手续

手续一样:绑定域名

先登录微信公众平台进入“公众号设置”的“功能设置”里填“JS接口安全域名”。如下所示,在大众平台拓展设置。

葡京签到送彩金 5

备考:登录后可于“开发者中心”查看相应的接口权限。

 

步骤二:引入JS文件

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.0.0.js

如需使用摇一摇周边力量,请引入
http://res.wx.qq.com/open/js/jweixin-1.1.0.js

备注:支持采取 AMD/CMD
标准模块加载方法加载

自然,我们一般编辑页面,为了有利于实现更多之效能,可能还会引入其他JS,如JQuery的类库等等。还有,我们尚得根据WeUI的jquery-weui类库,实现更助长的效力,如下是咱们案例代码里面的JS引用。

    <script src="~/Content/wechat/jquery-weui/lib/jquery-2.1.4.js"></script>
    <script src="~/Content/wechat/jquery-weui/js/jquery-weui.js"></script>
    <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js"></script>

 

手续三:通过config接口注入权限验证配置

怀有需要运用JS-SDK的页面必须先注入配置信息,否则将无法调用(同一个url仅用调用一不成,对于变化url的SPA的web
app可在每次url变化时开展调用,目前Android微信客户端不支持pushState的H5新特性,所以利用pushState来落实web
app的页面会造成签名失败,此题材会见于Android6.2中修复)。

wx.config({
    debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录1
    jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

});

以上的布就是JSSDK的主导所在,里面待安排好相应的appid,还有timestamp,nonceStr这些都没有特别之处,最值得注意的凡signature的兑现机制,这样咱们于后台生成好对应的价值,赋给JS页面就可以了,这样呢是最好安全的做法。

一般来说代码是咱实际项目中,在Asp.net的视图页面中的HTML代码,如下所示。

    <script language="javascript">
    var appid = '@ViewBag.appid';
    var noncestr = '@ViewBag.noncestr';
    var signature = '@ViewBag.signature';
    var timestamp = '@ViewBag.timestamp';

        wx.config({
            debug: false,
            appId: appid, // 必填,公众号的唯一标识
            timestamp: timestamp, // 必填,生成签名的时间戳
            nonceStr: noncestr, // 必填,生成签名的随机串
            signature: signature, // 必填,签名,见附录1
            jsApiList: [
               'checkJsApi',
               'onMenuShareTimeline',
               'onMenuShareAppMessage',
               'onMenuShareQQ',
               'onMenuShareWeibo',
               'onMenuShareQZone',
               'hideMenuItems',
               'showMenuItems',
               'hideAllNonBaseMenuItem',
               'showAllNonBaseMenuItem',
               'translateVoice',
               'startRecord',
               'stopRecord',
               'onVoiceRecordEnd',
               'playVoice',
               'onVoicePlayEnd',
               'pauseVoice',
               'stopVoice',
               'uploadVoice',
               'downloadVoice',
               'chooseImage',
               'previewImage',
               'uploadImage',
               'downloadImage',
               'getNetworkType',
               'openLocation',
               'getLocation',
               'hideOptionMenu',
               'showOptionMenu',
               'closeWindow',
               'scanQRCode',
               'chooseWXPay',
               'openProductSpecificView',
               'addCard',
               'chooseCard',
               'openCard'
            ]
        });

 

手续四:通过ready接口处理成验证

wx.ready(function(){
    // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,
    //则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。
});

以此ready的接口,也就是是于页面顺利加载了后的拍卖内容了,一般我们得开过多操作,都是用在页面加载了后才会调用相关的目标进行赋值、处理等操作。

例如我们于页面ready后,获取相应之GPS坐标等操作,可以为此底的JS代码实现。

        wx.ready(function () {
            wx.getLocation({
                type: 'wgs84', // 默认为wgs84的gps坐标,如果要返回直接给openLocation用的火星坐标,可传入'gcj02'
                success: function (res) {
                    var latitude = res.latitude; // 纬度,浮点数,范围为90 ~ -90
                    var longitude = res.longitude; // 经度,浮点数,范围为180 ~ -180。
                    var speed = res.speed; // 速度,以米/每秒计
                    var accuracy = res.accuracy; // 位置精度
                    $("#lblLoacation").text(latitude + "," + longitude);
                }
            });
        });

 

手续五:通过error接口处理失败验证

wx.error(function(res){
    // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,
    // 也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
});

斯error接口也就算是用来处理好信息之,一般景象下得在此地提醒用户出现的错。

 

2)、签名算法

签约生成规则如下:参与签署的字段包括noncestr(随机字符串),
有效之jsapi_ticket, timestamp(时间穿),
url(当前网页的URL,不含有#会同背后有)
。对所有待签名参数按照字段名的ASCII
码从小到特别排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里要小心的凡有着参数名叫都为多少写字符。对string1作sha1加密,字段名和配段值都运原始值,不开展URL
转义。

即signature=sha1(string1)。 示例:

noncestr=Wm3WZYTPz0wzccnW

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg

timestamp=1414587457

url=http://mp.weixin.qq.com?params=value

 

步骤1. 针对所有待签名参数按照字段名的ASCII
码从小到非常排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1:

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com?params=value

 

步骤2. 对string1进行sha1签名,得到signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed

 

注意事项

1.签名用的noncestr和timestamp必须跟wx.config中之nonceStr和timestamp相同。

2.签证名用的url必须是调用JS接口页面的整体URL。

3.是因为安全考虑,开发者必须以劳务器端实现签约的逻辑。

而出现invalid signature 等悖谬理解见附录5常表现错和解决办法。

如上就是JSSDK总体的利用流程,虽然看起比抽象,但是多也即是这些手续了。

 

地方的进程是实际的参数处理逻辑,我们要对承诺到C#代码的签实现,需要对几个变量进行拍卖,下面是呼应之生成noncestr、timestamp、以及签署等操作的代码。

        /// <summary>
        /// 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
        /// </summary>
        /// <returns>时间戳</returns>
        private static string GetTimeStamp()
        {
            TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
            return Convert.ToInt64(ts.TotalSeconds).ToString();
        }

        /// <summary>
        /// 生成随机串,随机串包含字母或数字
        /// </summary>
        /// <returns>随机串</returns>
        private static string GetNonceStr()
        {
            return Guid.NewGuid().ToString().Replace("-", "");
        }

还有我们只要贯彻JSSDK签名的处理,必须事先根据几独变量,构建好URL字符串,具体的处理过程,我们可以把它逐一放在一个Hashtable里面,如下代码所示。

        /// <summary>
        /// 获取JSSDK所需要的参数信息,返回Hashtable结合
        /// </summary>
        /// <param name="appId">微信AppID</param>
        /// <param name="jsTicket">根据Token获取到的JSSDK ticket</param>
        /// <param name="url">页面URL</param>
        /// <returns></returns>
        public static Hashtable GetParameters(string appId, string jsTicket, string url)
        {
            string timestamp = GetTimeStamp();
            string nonceStr = GetNonceStr();

            // 这里参数的顺序要按照 key 值 ASCII 码升序排序  
            string rawstring = "jsapi_ticket=" + jsTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";

            string signature = GetSignature(rawstring);
            Hashtable signPackage = new Hashtable();
            signPackage.Add("appid", appId);
            signPackage.Add("noncestr", nonceStr);
            signPackage.Add("timestamp", timestamp);
            signPackage.Add("url", url);
            signPackage.Add("signature", signature);
            signPackage.Add("jsapi_ticket", jsTicket);
            signPackage.Add("rawstring", rawstring);

            return signPackage;
        }

咱们注意到URL参数的字符串组合:

string rawstring = "jsapi_ticket=" + jsTicket + "&noncestr=" + nonceStr + "&timestamp=" + timestamp + "&url=" + url + "";

这边我们拼凑好URL参数后,就需运用签名的规则来贯彻签约的拍卖了,签名的代码如下所示,注释代码和方面代码等和。

        /// <summary>
        /// 使用SHA1哈希加密算法生成签名
        /// </summary>
        /// <param name="rawstring">待处理的字符串</param>
        /// <returns></returns>
        private static string GetSignature(string rawstring)
        {
            return FormsAuthentication.HashPasswordForStoringInConfigFile(rawstring, "SHA1").ToLower();

            ////下面和上面代码等价
            //SHA1 sha1 = new SHA1CryptoServiceProvider();
            //byte[] bytes_sha1_in = System.Text.UTF8Encoding.Default.GetBytes(rawstring);
            //byte[] bytes_sha1_out = sha1.ComputeHash(bytes_sha1_in);
            //string signature = BitConverter.ToString(bytes_sha1_out);
            //signature = signature.Replace("-", "").ToLower();
            //return signature;
        }

如此这般我们来了对应之价值后,我们就是可管其的参数全部居集合里面了供役使。

        /// <summary>
        /// 获取用于JS-SDK的相关参数列表(该方法对accessToken和JSTicket都进行了指定时间的缓存处理,多次调用不会重复生成)
        /// 集合里面包括jsapi_ticket、noncestr、timestamp、url、signature、appid、rawstring
        /// </summary>
        /// <param name="appid">应用ID</param>
        /// <param name="appSecret">开发者凭据</param>
        /// <param name="url">页面URL</param>
        /// <returns></returns>
        public Hashtable GetJSAPI_Parameters(string appid, string appSecret, string url)
        {
            string accessToken = GetAccessToken(appid, appSecret);
            string jsTicket = GetJSAPI_Ticket(accessToken);

            return JSSDKHelper.GetParameters(appid, jsTicket, url);
        }

下面我们经过切实的代码案例来介绍以的长河。

 

亚、小App向模块化App演变过程

乘胜微信开始逐步开放更多JSSDK的接口,我们得以采取自定义网页的办法来调用更多微信的接口,实现我们更助长的界面功能和功能,例如我们得以以页面中调用各种手机的硬件来获取信息,如摄像头拍,GPS信息、扫描二维码等等,本篇介绍如何使用这些JSSDK接口实现签到的作用,其中签到需要报送地理坐标和地点,调用摄像头实时拍摄,以及取得当前用户的系信息等等。

六、模块间事件传递

事件嘛,那得要对照 EventBus 和 广播,对比如下:

EventBus 和 广播对比

然一对比,不用连第三正库就可知促成,并且是Android通用方案,后期第三方接入和下都有利,所以模块间事件传递就因故:BroadcastReceiver,这个并例子都休想写了。大家还明白的。

终极,贴一下代码地址:Android
模块间通信调用示例代码

迎接关注作者微信公众号,及时得到作者更新:

安卓那些事

一、背景

Android
开发,从最初的一个人数团体,我之地盘我做主,随着团队及作业逐步变充分,单App开发渐渐跟不上工作发展步伐。

  • 代码复用性:
    再牛X的代码,不能够给任何团队下,其他团队无法利用,也不牛X。
  • 事务稳定:代码改动不可控,测试回归不可控,业务不平稳。
  • 高效发射小卫星:业务而公布新App,一切从头开始,没有现成组件或模块可共用,刘欢唱起:大未了从头再来?

故而就是倒及Android 模块化的路。

模块化架构改造:

最初架构到后期架构

  1. 将原App中的纱、图片、UIKIT都放到MAVEN仓库。
  2. 抽离BaseActivity 和 公共资源到Common中
  3. 日渐下没业务Module,做到事情隔离。

成就第3步时,就面临着模块间跳转和路由的选型了。所以路由的选型, 传送门
: Android路由选型

折腾定路由后,可以高达如下图的基础架构

模块化通用架构

然后新的问题也随即来了!模块间通信同模块调用。

以头抽业务模块过程中,如产品模块用到:获取购物车数量,或长到打物车,就拿及时有限单力量也下没到Common中,慢慢就是出形成一个多才多艺的Common。

于是面临着模块间的通信及调用的选型,问题如下:三独飘在的气球,要拿当下几乎单气球为落地。

如若落地之气球

  • Big Common : 随着模块拆解越来越多,下沉的工作逻辑吗会越多,大
    Common 吾不思量使!

  • Muti Module Call:
    多模块间调用,不叫生没到Common,那就算面临多模块间调用,就使物色模块间调用的方案。

  • Be On Cloud:
    在云端,上云,App上云的定义,第一步是被仓库代码可以被世家依赖调用到。而不是说:哥,你把自家及时代码拷走吧!把自身之BigCommon拷走!(人家才未拷,你以凭借他人库时,多一个效应而还不思量如果也)

季、CartService 之我要是找到你

假若是劳务端支出以来,会将CartService的贯彻集中登记到 Dubbo 或者
Spring中,通过有Key得到一个Service的实例。

透过一个Key获得一个实例

前面路由于的方案是:通过一个Key获取到一个路线。有点意思。经过比,ARouter
和 自己通过AIDL来实现两法方案,对比如下:

选型标准

ARouter 使用运行时注解强大的功效,自盖Map把 path
Service具体实例建立关系,跨模块可轻松地按照从定义路径取出实例调用。一项项来说明:

  • 泰:大厂产品,稳定性都OK。
  • 通用技能:第三正注解自盖保障Map 和 Android
    AIDL服务调用,AIDL更通用。
  • 跨越进程: ARouter 不支持,而AIDL专为过进程为生。
  • 易适配:第三方App接入学习成本而言,ARouter还要上下下,AIDL是Android开发必备技能,不用二不良上。
  • 老三方App调用:系统外App调用服务概念,ARouter不支持,AIDL
    通过Service export= true 的场面下,还是得以支撑的。

因而,我们考虑用AIDL Service的法来促成。

以此时节,你气了,哥,我裤子都消除了,你就叫本人看这个?

快 Show Me The Fucking Code!

五、代码秀

发出要24各项可以的女生上!

帅女生上

模块结构要下图:

演示代码结构截图

app: 客户端启动入口
module_product : 产品模块
module_shopcart: 购物车模块
service_shopcart: 购物车对外开放服务,通过地方截图可以看来就透过AIDL
声明了 IShopcartService 接口,并声明了 getCartCount
addToCart(String productId) 的能力。

扣押接口的兑现如下:

AIDL的实现

方的是免是最AIDL经典实现?还是原本的配方!还是原先的寓意!红茶叶,我若王老吉?

并在 AndroidManifest.xml 中声明Service如下:

屏幕快照 2017-12-01 17.53.37.png

同时,注明<intent-filter>
为:com.ssevening.www.service.shopcart.IShopcartService,这个就算是葡京签到送彩金寻觅这Service的Key,也是IShopcartService
的接近路径。 在 module_product 中的 ProductActivity 中如下方法调用:

逾模块调用服务

bindServiceserviceConnection 还是如数家珍的味道,但不过上面的Intent
本应该 intent = new Intent(this,ShopcartService.class) ,
ShopcartService恍如定义在
module_shopcart内,所以我们新增了:getServiceIntent()
并拿类名传递进入,然后通过getPackageManager().queryIntentServices(intent, 0);
查询出action=com.ssevening.www.service.shopcart.IShopcartService
Service,取第一独封装Intent对象,就得正常调用AIDL服务了,还是原先的配方,还是原的意味!

运作截图如下:

运转截图

购物车数以及添加到市物车的结果都早已显示出来,同时经过网络调用把
www.baidu.com 源码也成返回。

从那之后,模块间调用基本方案敲定,余下的尽管是getServiceIntent()
方法的提高优化和没抽到Maven仓库的劳作了。

末了,上次总长由于让坑了同等蹩脚,详见:Android M queryIntentActivities return
null list 蹲坑记
,用户在App管理界面,可以关掉AppLinks的行,我还记得,所以这次专门去押一下
context.getPackageManager().queryIntentServices(intent, 0);

代码截图如下:

queryIntentServices

,通过看源码,我们发现并没有用户关掉相关的过滤选项,这样咱们尽管放心了。

我们随后说模块间事件传递。 比如
登陆状态的变化;在金币频道点击签到按钮,跳反至签到模块签到,签到得后,回到金币模块签到成功的事务传递。