首页 > 技术文章 > android开发经验谈(java)

qsl568 2015-12-15 15:38 原文

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的生命周期

推荐阅读