1、连接GPRS网络优化
由于GPRS基带网络每次连接都需要耗费时间,开发中应对网络进行区别处理(3G、4G、wifi不存在这个问题)——可以针对GPRS网络心跳保持连接,考虑用户流量和耗电的问题,让用户自助勾选“网络加速”选项。
2、鉴权加密,防外挂
(1)签名(三列函数)+加盐
(2)尽量不要通过提交到后台获取sign,防外挂;对称加密保护秘钥,代码混淆打包;
(3)防webshell攻击,过滤扩展名是无效的,数据写权限的隔离,专线ip局域网访问数据等网络手段
3、防止重复提交
界面disable、计数器,单例、synchronized;
后台建立缓存表,队列操作;
数据层监控
4、UDP消息推送
UDP穿透实现UDPserver分别绑定不同的udpclient的ip和端口,方便寻址,这样的推送节约资源,且开发效率比较高。
5、手机令牌
自助加密算法在svr和app分别计算出令牌key,要注意的问题是随机数的选择,时间变量要一致,最好采用标准时间,指定时间失效。
6、机票整合
机票代理商资源混乱,整合建模,实现自助的机票基础数据(机场、航线),供本地使用;
7、Dcloud的MUI+Html5+实现APP方案
使用HTML5+开发的移动App并非mobile web页面。这是新手最容易混淆的地方。mobile web的文件存放在web服务器上,而移动App的文件存放在手机本地,编写移动App的html、js、css文件被打包到ipa或apk等原生安装包,在手机客户端运行。
阉割了web在B/s上面的优势,而仅仅用html5+js来作为app开发语言,亮点在于可以用hbuilder自助打包成apk和ipa,解决了原生html5实现web app的卡顿和白屏等问题,遗憾的是打包需要注册并提交到dcloud服务器才能打包。
8、缓存共用数据
应对网络请求进行监控和优化,对系统共用数据,应用启动或者登录时候分别加载一次就行,避免重复请求后台;
大数据的下载用分页,在写入csv的时候最好分批写入,不要一行一行的写入,效率高很多;
9、如何避免ANR
避免在主线程上进行复杂耗时的操作,比如说发送接收网络数据/进行大量计算/操作数据库/读写文件等。这个可以通过使用AsyncTask或者使用多线程来实现;
broadCastReceiver 要进行复杂操作的的时候,可以在onReceive()方法中启动一个Service来处理;
10、android的生命周期
四大组件:activity、service、broadcast、content provider
activity的生命周期:
(1)onCreate-->2、onStart-->3、onResume-->4、onPause-->5、onStop-->6、onDestory
(2)onStop-->onRestart-->onStart
(3)onPause-->onResume
(4)启动事件:onstart、oncreate、onresume
*OnsaveInstance和OnrestoreInstance的区别
onsaveInstance用来保存活动被杀之前的状态;通常onSaveInstanceState()只适合用于保存一些临时性的状态,而onPause()适合用于数据的持久化保存。
onRestoreInstanceState()在onStart() 和 onPostCreate(Bundle)之间调用。
例:A通过onSaveInstanceState将有机会保存其用户界面状态,使得将来用户返回到activity A时能通过onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复界面的状态。
*Service和线程有什么区别?
——这是两个不同的概念,面试的时候当时我是一头雾水!
service运行在主线程中的,也就是说如果在service里面有耗时代码,必然引发ANR;
http://blog.csdn.net/jie1991liu/article/details/16105605
*通知Notification和广播Broadcast的区别?
11、后台监控方案
我们检测一个url是否正常直接监控http的response status就好了,配置一个STMP,发邮件到绑定微信的qq邮箱,能够做到实时的发现问题;
二、面试题
1、java线程相关、wait与sleep的区别?
sleep()方法,属于Thread类中的;而wait()方法,则是属于Object类中的。
Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制;
相反,在调用sleep()方法的过程中,线程不会释放对象锁。
注:synchronized 、volatile和java.util.concurrent.locks.lock的异同
Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。
——加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用synchronized 修饰的方法 或者 代码块。
——用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新的值。volatile很容易被误用,用来进行原子性操作。
——lock包含synchronized不具备的功能,如锁投票、定时锁等候、可中断锁等候等;Lock一定要求程序员手工释放,并且必须在finally从句中释放;性能高于synchronized;
2、Activity和services之间的传值,有哪几种方式?
——1、通过binder对象的bindservice方法;2、通过广播的形式:当我们的进度发生变化的时候我们发送一条广播,然后在Activity的注册广播接收器,接收到广播之后更新ProgressBar(比如Service要向多个Activity发送同样的消息的话,用这种方法就更好)
onCreate()-->onStart()-->onBind()-->onUnbind()[重载后的方法需返回true]-->onRebind()
http://blog.csdn.net/xiaanming/article/details/9750689
3、FrameLayout和RelativeLayout的区别
——framelayout、Relativelayout、LinearLayout(Tablelayout)、absolutelayout
4、.9图片处理
上左定义拉伸区域;右下是内容部分;
left和top边框中交叉部分是可拉伸部分,未选中部分是静态区域部分;
right和bottom边框中交叉部分则是内容部分(变相的相当于定义看一个内边距,神似padding功能)
5、Android2到android4的演变,jdk6和jdk7的异同,对开发的影响
android4以后,不允许主线程访问网络,我觉得更加凸显了异步在app开发中的思想,有效的提升了应用本身的流畅性和用户体验。
6、Dvm进程和linux进程的关系
——DVM指dalivk的虚拟机。Dalvik虚拟机运行的是其专有的文件格式Dex
——每一个DVM都是在Linux 中的一个进程
7、View和SurfaceView和GlserfaceView的区别
——View:显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等;必须在UI主线程内更新画面,速度较慢。
——SurfaceView:基于view视图进行拓展的视图类,更适合2D游戏的开发;是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快。
——GLSurfaceView:基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图;是SurfaceView的子类,openGL专用。
8、&和&& 的区别——&值按二进制位做与运算
9、Android的IPC机制(进程间通信)
——AIDL方式、Messager方式
Messager实现IPC通信,底层也是使用了AIDL方式。和AIDL方式不同的是,Messager方式是利用Handler形式处理,因此,它是线程安全的,这也表示它不支持并发处理;而AIDL方式是非线程安全的,支持并发处理,因此,我们使用AIDL方式时需要保证代码的线程安全
http://www.cnblogs.com/freeliver54/archive/2012/06/13/2547739.html
10、handler的机制原理,内部如何实现的,队列消息的实现机制
背景:子线程通常是不能直接更新主线程(UI线程)中的UI元素的
——andriod提供了Handler 和 Looper 来满足线程间的通信。Looper类用来管理特定线程内对象之间的消息交换
——Message:消息对象,记录消息对象的类;
——MessageQueue:消息队列,用来存放Message的数据结构;按先进先出原则存放消息;
——Handler:消息的处理者。
——Looper:MessageQueue的管理者,线程中唯一。
1)、首先Looper.prepare()声明在本线程中保存一个Looper实例,然后该实例中保存一个MessageQueue对象;因为Looper.prepare()在一个线程中只能调用一次,所以MessageQueue在一个线程中只会存在一个。
2)、调用Looper.loop()会让当前线程进入一个无限循环,不端从MessageQueue的实例中读取消息,然后回调msg.target.dispatchMessage(msg)方法。
3)、Handler的构造方法,会首先得到当前线程中保存的Looper实例,进而与Looper实例中的MessageQueue想关联。
4)、Handler的sendMessage方法,会给msg的target赋值为handler自身,然后加入MessageQueue中。
5)、在构造Handler实例时,我们会重写handleMessage方法,也就是msg.target.dispatchMessage(msg)最终调用的方法。
11、Map的并发问题?set、vector、list区别
JAVA的容器---List,Map,Set
Collection
├List
│├LinkedList
│├ArrayList
│└Vector ——类似ArrayList,但是同步的
│ └Stack
└Set ——不包含重复元素的collection
Map
├Hashtable
├HashMap
└WeakHashMap
引自http://www.cnblogs.com/hnrainll/archive/2013/04/08/3006638.html
12、泛型的作用
——将原来具体的类型参数化
13、HashMap和HashTable的区别
——hashTable继承Dictionary;hashmap继承AbstractMap;
——hashtable的方法是同步的;
——hashtable的key和value都不允许使用null
——遍历的内部实现不一样
——哈希值使用不一样
14、object的方法
equals、getClass、hashCode、clone、toString、notify、finalize、wait
http://www.blogjava.net/jiafang83/archive/2008/12/05/244510.html
15、dpi,dip(dp),px,density的关联和区别
【px】PX = density * DP
【dpi】dots per inch,一英寸多少个像素点,像素密度,DPI本身的单位也是 像素/英寸,标准dpi = 160
【dp】即dip,density independent pixels, dp = (DPI/(160像素/英寸))px = density px
*注意,这里都是带单位的。px是单位,dp是单位,density没单位。
【density】和标准dpi的比例,160px/inch,DPI/(160像素/英寸)
【分辨率】 横纵2个方向的像素点的数量,常见取值 480X800 ,320X480
【屏幕尺寸】 屏幕对角线的长度。电脑电视同理。
转自:http://www.cnblogs.com/yaozhongxiao/archive/2014/07/14/3842908.html
16、fragment的生命周期