Android基础
GC原理时机以及GC对象;
可以通过一些技巧和方式让GC运行更加合理、高效
当程序员创建对象时,GC就开始监控这个对象地址、大小以及使用情况。通常GC采用有向图的方式记录并管理堆中的所有对象,通过这种方式确定哪些对象是“可达”的,哪些对象是“不可达”的。当GC确定一些对象为“不可达时”GC就有责任回收这些内存空间
四大组件及生命周期;ContentProvider的权限管理(读写分离,权限控制-精确到表级,URL控制);Activity的四种启动模式对比;Activity状态保存于恢复
Fragment生命周期;Fragment状态保存
startActivityForResult是哪个类的方法,在什么情况下使用,如果在Adapter中使用应该如何解耦
AsyncTask原理及不足;
1.AsyncTask可能存在新开大量线程消耗系统资源和导致应用FC的风险
2.AsyncTask一旦执行了doInBackground,就算调用取消方法,也会将doInBackground里面的代码执行完毕,才会停止。
3.线程池不经维护,当大量异步发生时,导致线程池满了,会出异常。
IntentService原理
IntentService是继承于Service并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们去手动控制。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,以此类推。
AstncTask+HttpClient与AsyncHttpClient有什么区别
如何保证一个后台服务不被杀死;比较省电的方式是什么
1.把service写成系统服务,将不会被回收(未实践):
在Manifest.xml文件中设置persistent属性为true,则可使该服务免受out-of-memory killer的影响。但是这种做法一定要谨慎,系统服务太多将严重影响系统的整体运行效率。
2.提高service的优先级(未实践):
设置android:priority="1000"
Xml代码 收藏代码
3.将服务写成前台服务foreground service(已实践,很大程度上能解决问题,但不能保证一定不会被杀):
重写onStartCommand方法,使用StartForeground(int,Notification)方法来启动service。
注:前台服务会在状态栏显示一个通知,最典型的应用就是音乐播放器,只要在播放状态下,就算休眠也不会被杀,如果不想显示通知,只要把参数里的int设为0即可。
Java代码 收藏代码
Notification notification = new Notification(R.drawable.logo,
"wf update service is running",
System.currentTimeMillis());
pintent=PendingIntent.getService(this, 0, intent, 0);
notification.setLatestEventInfo(this, "WF Update Service",
"wf update service is running!", pintent);
//让该service前台运行,避免手机休眠时系统自动杀掉该服务
//如果 id 为 0 ,那么状态栏的 notification 将不会显示。
startForeground(startId, notification);
同时,对于通过startForeground启动的service,onDestory方法中需要通过stopForeground(true)来取消前台运行状态。
ps:如果service被杀后下次重启出错,可能是此时重发的Intent为null的缘故,可以通过修改onStartCommand方法的返回值来解决:
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
Java代码 收藏代码
//if this service's process is killed, then it will be scheduled for a restart and the last delivered Intent re-delivered to it again
return Service.START_REDELIVER_INTENT;
4.利用ANDROID的系统广播检查Service的运行状态,如果被杀掉,就再起来(未实践):
利用的系统广播是Intent.ACTION_TIME_TICK,这个广播每分钟发送一次,我们可以每分钟检查一次Service的运行状态,如果已经被结束了,就重新启动Service。
具体的实现,可以参考这个链接:http://mobile.51cto.com/abased-374969.htm
补充:以上是解决service容易被回收的方法,但是再进一步深究,为什么service会被系统杀掉呢?通过分析手机的logcat日志发现这么一段话:
引用
06-19 08:01:32.755 W/ActivityManager( 2081): Killing ProcessRecord{43a96570 6437:com.example.helloandroid/u0a187}: background ANR
06-19 08:01:32.910 I/ActivityManager( 2081): Process com.example.helloandroid (pid 6437) (adj 0) has died.
看来这个ANR(Application Not Responding)是关键。上网查到的解释是:
在如下情况下,Android会报出ANR错误:
– 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件
– BroadcastReceiver 没有在10秒内完成返回
如何通过广播拦截和abort一条短信;
广播是否可以请求网络;
不可以
广播引起anr的时间限制
10 s
进程间通信,AIDL
Handler机制及底层实现
Binder机制及底层实现
ApplicationContext和ActivityContext的区别
一张Bitmap所占内存以及内存占用的计算
对于应用更新这块是如何做的?(灰度,强制更新,分区域更新)
混合开发,RN,weex,H5,小程序(做Android的了解一些前端js等还是很有好处的)
说一款你认为当前比较火的应用并设计(直播APP)
常见编码方式;utf-8编码中的中文占几个字节;int型几个字节
实现一个Json解析器(可以通过正则提高速度)
MVC MVP MVVM; 常见的设计模式;写出观察者模式的代码
TCP的3次握手和四次挥手;TCP与UDP的区别
HTTP协议;HTTP1.0与2.0的区别;HTTP报文结构
HTTP与HTTPS的区别以及如何实现安全性
原地址:
http://mp.weixin.qq.com/s?__biz=MzI2OTQxMTM4OQ==&mid=2247484286&idx=1&sn=e5843fb79d8a36ab063699b5fb9a0711&chksm=eae1f62cdd967f3a576396f8402581326b835b8327ed5f20f23896fcd22c2115e77863b4115b#rd