县科协微网站建设,源码屋整站源码,网页小游戏修改器,重庆装饰公司15大排名一、Activity
1、onSaveInstanceState(),onRestoreInstanceState的调用时机
onSaveInstanceState 调用时机
从最近应用中选择运行其他程序时
但用户按下Home键时
屏幕方向切换时 按下电源案件时
从当前activity启动一个新的activity时
onRestorInstanceState调用时机
只…一、Activity
1、onSaveInstanceState(),onRestoreInstanceState的调用时机
onSaveInstanceState 调用时机
从最近应用中选择运行其他程序时
但用户按下Home键时
屏幕方向切换时 按下电源案件时
从当前activity启动一个新的activity时
onRestorInstanceState调用时机
只有activity确实是呗系统回收重新创建activity的情况下才会调用。例如
屏幕方向切换生命周期如下
onPause-onSaveInstanceState-onStop-onDestroy-onCreate-onstart-onRestoreInstanceState-onResume
2、activity的启动模式和使用场景
standard
默认模式每次启动activity 都会创建一个新的实例
singleTop
一般应用于通知消息打开的页面
如果要启动的activity已经再栈顶则不会重新创建指挥调用该activity的onnewintent方法。
如果要启动的activity不在栈顶则会重新创建该activity的实例
singletask
一般适用于主页面
如果要启动的activity已经存在于它想要归属的栈中那么不会创建新实例将栈中位于该activity上的所有的activity出栈同事该activity的onnewintent方法会被调用
singleinstance
例如呼叫来电界面
要创建再一个新栈然后创建该activity实例并压入新栈中新栈中只会存在这一个activity实例
3、activity之前传递数据的方式intent是否有大笑限制如果传递的数据量偏大有哪些方案
有最好不要超过512k
可以用本地存储或者缓存等方案进行传递
4、显示启动和隐示启动
显示启动 直接再清单文件写好调用
隐示启动 在清单文件里通过intent-filter 进行name配置调用时可改成name值进行启动
5、scheme使用场景协议格式如何使用
scheme是页面内跳转协议可以自定义scheme协议
定义格式 使用Uri.parse(“hr://test:8080/goods?goodsid8888nametest”) 6、ANR的场景
Service TimeOut 未在规定时间执行完成前台服务20S后台200s
BroadCastQueue TimeOut 围在规定时间内处理完广播 前台广播10s后台60s内
ContentProvider TimeOut publish 在10s内没有完成
Input Dispatching timeout 5s内未响应键盘出入触摸屏幕等事件
Activity的生命周期回调阻塞并不会直接触发ANR职不过死循环阻塞了主线程如果系统有上述情况发生就无法在相应的时间内处理从而触发ANR
7、oncreate和onsaveinstancestate回复数据时的区别
onrestoreintstancestate 不一定会被调用因为它只有在上次activity被回收了才会调用
oncreate里的bundle参数可能为空一定要做非空判断而onrestoreintstancestate的bundle参数一定不会是空值
二、Service
1、service的生命周期两种启动方式的区别
startService/bindService
如果服务已经开启多次执行startService 不会重复执行oncreate而是会调用onStart和onStartCommand
如果服务已经开启多次执行bindService时onCreate和onBind方法并不会被多次调用
startService 不会依赖于调用者bindService 依赖于调用者
2、service于activity实现通信
通过Binder对象
Service继承Binder的内部类并添加相应的逻辑方法
或通过BroadCast广播与activity通信
3、IntentService是什么IntentService原理
IntentService是Service的子类默认开启了一个工作线程HandlerThread使用这个工作线程逐一处理所有启动请求在任务执行完毕后会自动停止服务只要实现一个方法onHandleIntent该方法会接受每个启动求救的intent能够执行后台工作和耗时操作。
三、BroadcastReceiver
1、广播的分类和使用场景
广播分为两个角色发送着 和 接受着
广播接收器分为两种静态注册和动态注册
静态通过清单文件的标签申明的BroadcastReceiver
动态通过AMS.registerReceiver的方式注册动态注册更灵活可在不需要时通过unregisterReceiver取消注册
根据发送形式分为 1、普通广播通过Context.sendBroadcast发送可并行处理 2、系统广播管使用系统广播时只需在注册广播接受着时定义相关的action即可不需要手动发送广播例如网络变化锁屏飞行模式等 3、有序广播指的是发送出去的广播被BroadcastReceiver按照先后顺序进行接收发送方式变为sendOrderedBroadcase(intent)。 4、App应用内广播Android的广播可以跨进程通信 5、粘性广播由于在5.0已经失效不建议使用
四、ContentProvider
主要用来是应用间数据共享提供统一的接口例如通讯录通话记录等
五、Handler
1、handler的实现原理
共分为 Handler、Message、MessageQueue和Looper
Handler负责消息的发送和处理
Message消息对象相当于是实体
MessageQueue消息队列用于存放消息对象的数据结构
Looper消息队列的处理者用于轮询消息队列的消息对象
Handler发送消息时调用MessageQueue的enqueueMessage插入一条消息到MessageQueue,Looper不断轮询调用MessageQueue的next方法如果发现message就调用handler的dispatchMessagedispatchMEssage被成功调用接着调用handlerMessage
2、子线程中能不能直接new一个Handler
不能因为Handler的构造方法中会通过Looper.myLooper获取looper对象
3、Handler导致的内存泄露原因和解决方案
非静态内部类和匿名内部类都会隐式持有当前类的外部应用
当activity中使用handler然后被销毁时还存在未处理或正在处理的消息就会造成内存泄漏
解决方式1、将Handler的子类设置成静态内部类使用WeakRererence弱引用持有Actiivty实例
2、当外部类结束生命周期时清空Handler内部消息队列
4、HandlerThread时什么好处原理使用场景
HandlerThread本质是一个线程类他集成了Thread有自己的内部Looper对象通过Looper.loop进行循环通过获取HandlerThread的looper对象传递给Handler对象然后再handlerMessage方法中执行异步任务
优势
将loop运行在子线程中处理减轻了主线程的压力是主线程更流畅有自己的消息对列不会干扰ui线程串行执行开启一个线程起到多个线程的作用
劣势
由于每一个任务队列逐步执行一旦队列好事个过长消息延时
对于io等操作线程等待不能并发
5、idleHandler使用场景
闲时机制不占用资源