【淘宝技术沙龙·第九期】移动客户端开发随想

  • 格式:pdf
  • 大小:2.48 MB
  • 文档页数:55

移动客户端开发随想2012.5北京张杰(@木泽水)•客户端开发随想•客户端的近点通信无线手机微博渠道运营市场客户端wap运营微博。

研发产品测试•年轻,经验欠缺,有干劲儿,的创业团队Symbian ,KJava以Android ,iOS 为主的全平台8人80人2009年今天微博以微博为主的几十款客户端平均1.5个月迭代一次1.0.0 2010-1-191.0.4 2010-4-211.0.6 2010-4-291.0.7 2010-5-101.0.8 2010-5-112.0.0 2010-7-22.0.1 2010-7-62.0.2 2010-7-152.0.3 2010-8-182.0.4 2010-9-92.1.0 2010-12-12.1.1 2010-12-12.1.2 2010-12-132.1.3 2010-12-152.2.0 2010-12-242.2.1 2011-1-173.0.0 至今1.0.0 2010-1-191.0.3 2010-4-291.1.0 2010-5-152.0.0 2010-7-222.1.0 2010-9-252.2.0 2010-11-122.3.0 2010-12-082.4.0 2011-1-203.0.0 至今iPhoneAndroid成绩•注册用户 3.24亿•日活跃用户2900w•无线端用户超过50%团队迅速膨胀-原因•2010,2011 智能机销量突飞猛进•各公司在移动互联网产品布局,尝试不断尝试新浪视频微博客户端掌中新浪微友新浪视野新浪博客新浪轻博音乐天气通财经读书某次推广活动400003000020000100002011年11月7日做过tips推广和网页推广的效果新浪视频和天气通两个产品通过浪首推荐,两者下载量均有增加。

但天气通停止推广后,用户持续增加,而新浪视频日登录用户迅速下降,恢复推广前情况1.优质产品加推广如虎添翼,而占位类产品停止推广后依旧很难成规模。

2. 我们应该集中资源发展优质产品。

客户端-优化用户体验•产品:外部质量,内部质量,缺一不可•测试:功能测试,单元测试,性能测试,缺一不可领导A说:xxapp的启动速度变慢了领导B说:xxapp图片处理质量降低不少领导C说:xxapp很费电,费流量领导D说:xxapp的正文被滑动条盖住了领导E说:xxapp的字体貌似不一般大。

问题出在哪儿?•测试说:按照test case执行的•研发说:代码按照UE写的•产品:。

我以为系统就是这样#Dumpsys meminfodalvik native安卓APP 内存24m or 32m 超过会怎样?OOM 。

您的APP占多少内存?做完还是做好?移动客户端开发中小型迭代快变更快Native 更新慢技术不是主要瓶颈特点建议影响>流程>null 拥抱变化灰度发布追求细节用数据说话更新新版本•自动提醒升级•手动升级•强制升级•360模式客户端稳定性•第一版架构•向前兼容•多机型,多分辨率测试•厂商与主版error统一•完善单元,集成测试客户端耗电量&流量•后台轮询or push•Widget•Wake Lock•耗CPU操作开发周期,如何又好又快•流程化提高效率•与推广周期同步•需求变更频率Hybird几款hybird产品JQuery Mobile Sencha touchPhoneGapH5+Native占位灰度发布全平台紧急上线用途尝试跟进创新进展客户端与近点通信NFC (Near Filed Communication)•近距离无线通讯技术NFC 蓝牙红外网络类型点对点单点对多点点对点使用距离4cm≤10m≤1m2.1 Mbps~1.0 Mbps速度106, 212, 424kbps规划速率868kbps721 kbps 115kbps建立时间< 0.1s6s0.5s安全性具备,硬件实现具备,软件实现不具备,使用IRFM 时除外通信模式主动-主动/被动主动-主动主动-主动成本低中低NFC 的应用•读卡器模式•卡模拟模式•点对点通信模式配置注册处理NFC Tag :NFC chipNDEF :NFC Data Exchange Formate AndroidManifest.xml ACTION_NDEF_DISCOVEREDACTION_TECH_DISCOVEREDACTION_TAG_DISCOVERED Handle NFC IntentWIFI Direct•wifi直接连接•Android4.0系统•距离较传统直传方式远(蓝牙,红外)•无须APDevice BDevice AGroup Owner Group MemberOwnerMember Member多个设备互相连接,只有一个GroupOwner配置注册监听连接完整的连接过程,与传统socket类似常用API解析WifiP2pManger中的重要方法Method Descriptioninitialize()初始化方法,在调用所有其他方法前调用connect()进行P2P连接cancelConnect()取消连接requestConnectInfo()请求一个设备的连接信息createGroup()创建一个P2P Group,并且当前设备成为Group ownerremoveGroup()移除GrouprequestGroupInfo()获得Group信息.discoverPeers()扫描周边有哪些设备requestPeers()获得设备列表与各方法相关的回调Listener回调Listener相关的方法WifiP2pManager.ActionListener connect(),cancelConnect(),createGroup(),removeGroup(),and discoverPeers()WifiP2pManager.ChannelListener initialize()WifiP2pManager.ConnectionInfoListener requestConnectInfo()WifiP2pManager.GroupInfoListener requestGroupInfo()WifiP2pManager.PeerListListener requestPeers()广播事件Intent DescriptionWIFI_P2P_CONNECTION_CHANGED_ACTION连接改变时发出的intenWIFI_P2P_PEERS_CHANGED_ACTION首先调用discoverPeers()方法去扫描周边设备,当收到这个广播时,可以调用requestPeers()方法获得可用设备列表WIFI_P2P_STATE_CHANGED_ACTION设置Wi-Fi Direct为enabled或disabled时受到的广播WIFI_P2P_THIS_DEVICE_CHANGED_ACTION设备信息改变时(如设备名称)的广播.示例:基于近点的DrawSomthingDevice A Device B1. 添加权限2. 获得WifiP2pManager,Channel实例3. 注册广播,处理相关Intent4. 探测周边设备5. 探测到设备后,获取设备列表6. 建立连接,获取连接信息…7. 在DrawPadView中,将自己画的点通过Socket传输8. 接收方收到socket信息后,绘制本地canvasAllJoyn无须服务器的设备间近距离通信平台技术AllJoyn简介•高通公司•开源技术•支持多种语言(C/C++, Java, c#)•夸平台(Windows,linux,Android,iOS)•基于AP•https:///示例:微名片AllJoyn 应用架构AllJoyn BusDD SSC CDevice 1Device 2D: daemonS: serviceC: client编写一个基于AllJoyn的APP1.装载alljoyn库文件2.连接alljoyn deamon3.监听设备4.创建本地alljoyn bus接口5.远程实现alljoyn bus接口,实现远程调用(RPC)6.获取接口事例,调用实习数据传输1. 装载alljoyn_java.so库文件static {System.loadLibrary("alljoyn_java");}2. 连接alljoyn busmBus= new BusAttachment("applicationName");mBus.registerBusObject(this, "/servicepath");mBus.connect();int flags = 0; //no request name flagsmBus.requestName("", flags);3. 监听获取周围设备信息private class ChatBusListener extends BusListener{public void foundAdvertisedName(String name, short transport, String namePrefix) { short contactPort= CONTACT_PORT;SessionOpts sessionOpts= new SessionOpts();Mutable.IntegerValue sessionId= new Mutable.IntegerValue();Status status = mBus.joinSession((String) msg.obj,contactPort,sessionId,sessionOpts,new SessionListener());}public void lostAdvertisedName(String name, short transport, String namePrefix) { //TODO}}。