Android移动开发中通用技术整理
悲剧的住院了,闲来无聊。整理下以前做的几个项目的写下的笔记。因为项目的通用性,以前老大给的建议是能做成类似于封装完的jar包。
因为没什么时间,还有老大太高估我了= =。
在此只是列一下几个通用技术
通用技术一:App进入后的网络检测。
代码很简单
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* 网络监测工具
*
* @author Nono
*
*/
public class NetUtil {
public static boolean checkNet(Context context) {
try {
//获取连接管理对象
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
//获取活动的网络连接
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (info != null && info.isConnected()) {
if (info.getState() == NetworkInfo.State.CONNECTED) {
return true;
}
}
}
} catch (Exception e) {
}
return false;
}
网络上有更详细的check方式,就是list出所有的连接。个人感觉一般没什么大的意义。就这样的简版就行了。
通用技术二:版本检测。
这也是个常用的功能,基本目前所见的应用都带。
基本流程图
通用技术三:数据缓存
数据缓存也是常用的技术。
对于资讯类应用尤为重要。
进入显示区,获取填充数据:
Step 1:根据网络请求参数生成的唯一文件名(一般使用MD5,因为以该文件名命名的文件会存入到本地),进行本地检索。
文件存在,执行Step 4,否则执行Step 2;
Step 2:正常的网络请求操作;
Step 3:根据指定参数生成唯一文件名对数据做本地存储;
Step 4:数据获取和显示;
基本步骤如上。
图片类资源缓存的扩展。
特别提到所谓的图片资源是我们常说的面试中比较常提及到的一个词汇:内存溢出。
简单举例:比如国内市场上的应用Market.
应用商店中最多的资源就是图片,一个ListView下拉,那图片是刷刷的。但是无论我们怎么拉,应用时不报错的,然后当我们拉到很下面时,在往上拉时,发现图片执行了异步加载,先显示默认图片,然后过会会显示图标。
此处设计到两个方面:1,是图片数据缓存,因为我们每次去刷新界面不可能都再次网络请求获取。2.防内存溢出
第一点很简单,就如上面提到的图片最本地缓存。
第二点其实又是也不太明白,上回有哥们说关于到C层释放问题。我一直以为用常规的对显示view对象的重用就可以解决的,这样每次图片资源就一个屏幕显示的图片size。
后来看到一篇文章说:
尽量不要使用setImageBitmap或setImageResource
或BitmapFactory.decodeResource来设置一张大图,
因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,
需要消耗更多内存.
因此,改用先通过BitmapFactory.decodeStream方法
。。。。。。。。。。。。。。。。。。。。。。。。。
不懂底层真心无力。无论是是否有用,至少也是种未雨绸缪的态度。了解的可以去研究下。文章具体什么名忘了,百度下估计就有了。
以上两点其实都不是问题,因为都解决了。
但是为了考虑到性能问题,IO读取操作的速度大家都懂。
然后就有人考虑到图片的内存存取。为了防溢出,可以用软引用(outMemory前自动释放内存)或是引用队列(内存中暂存最近使用资源,又可人为控制溢出)。
对于软应用 有某个开源代码ImageManager类,(本人也不知道到底是不是开源的,上上一个项目中发现此类,开注释代码是* Copyright (C) 2009 Google Inc.,我猜是开源的吧,有需要的朋友可以搜索下code)。
内存暂存的改进是让view刷新图片加载时更加流畅和完美,但完美也是有代价。
如此设计,数据获取就多了内存检索一步。
通用技术四:网络请求
一般公司都是封装了自己的HttpClient类或是jar
一般Android上的网络请求分3种。
一种是apache的jar,第二种是java 中HttpURLConnection.第三种忘了
本人更喜欢apache提供的,因为它基本把每个实体都分化成类。用的比较清爽。当然也是个人爱好。
通用技术五:网络请求协议
常用XML,Json。两种都用过。但都没用到Android中提供的原生Api。
一条网络请求的步骤:
1.一般使用一个javaBean,setter所有需要的参数
2.bean转json或是xml格式的string。
3.请求和返回。
4.json或是xml格式的String转成bean
其实一开始我天真的这么假设过,传来传去最后都是要转bean。为何不序列化bean文件直接传。
后来了解到:序列化的话就存在序列id,那么服务器和客户端就需要同一套序列化代码。这样对于一对多的服务器和客户端就有所问题了。
第二点是这样的效率是非常低下的。
对于Android中提供的解析Api,貌似没有直接 bean2JsonObject这一实现,就是直接new JsonObject(beanobject)?貌似没有= =没注意。
然后自己写的话,无非用反射,遍历bean中的setter或是getter方法对字符窜的拼接。
XML因为有个哥们写完了。json的话可以参考一个 JSON.org包,具体我也忘了我从哪边下载的。然后稍微修改了一下对于其中的getXXX反射的判断,
因为LZ的把Bean做成了单例,单例中存在了一个getInstance()方式,当时郁闷了半天,一解析就stackxxxxx,就是内存泄露啦什么的。因为对于刚提到的这个get方法没做判断,无穷获取对象解析,就挂了。
后来听说请求协议还可以用goggle的protobuf协议,据说速度更快,好几倍,FaceBook就用放入这个(听说)。
但是对于Google自己的开发分操作系统为什么不直接提供该api,不是太清楚。
过段时间有空去看下文档。谢谢老大的提起。
通用技术六:通信加密 www.zzzyk.com
这块就太繁琐了,想必不同公司用的都自己的一套加密。
我用过RSA的非对称加密,简单流程就是客户端和服务端在应用开启网络正常下,交换公钥。然后就是客户端数据传输前
用ClientPrivateKey加密,服务端获取后用一开始交换过去的ClientPublicKey解密数据。反过来同理。
但是个人觉得这样的加密,攻击者只需一开始截取了公钥。。。。就。。。
鄙人对加密真心未涉足。不了解。
还有是用过常用的放篡改的MD5以及MD5前的3des加密。但是安全性不敢恭维。
一般人只要反编译了该应用就获取了加密类下的keycode。。然后又是悲剧了。。
通信加密我觉得是未来互联网中最重要的一部分,基本所有的应用都慢慢设计到用户名和密码管理这一块。
小到移动支付,大到智能住宅。我想谁都不希望被他人动了自己的钱包或是房子。
而在这个密码爆炸的年代。。谁没十几二十个密码啊!!
通用技术七:消息推送
这绝对是个让人恶心却又让人喜欢的技术。
如以前的恶意短信。
还好现在的应用基本都有提供给用户开启以及定制的选项。
补充:移动开发 , Android ,