Activity生命周期
1.activity的4种状态
running/paused/stopped/killed
activity生命周期图.png
2.安卓进程优先级
前台、可见、服务、后台、空
Fragment
1. Fragment为什么被称为第五组件
- 有自己的生命周期,加载到activity里。
- 更节省内存,ui切换更自然。
2. Fragmnet 加载到Activity的方式
- 静态加载:添加Fragment到Activity的布局文件中
- 动态加载:动态再activity中添加fragment
FragmentTransaction transaction = manager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
transaction.add(R.id.fragment_container, fragment1);
transaction.commit();
3. FragmentPagerAdapter与FramentStatePagerAdapter的区别
- FragmentPagerAdapter前者适合页面较少,只是把ui分离,没有回收资源
- FramentStatePagerAdapter后者适合页面较多的情况。destroyItem()回收资源,回收内存。
4. Fragment生命周期
fragment生命周期图.png5. Fragment的通信
1)在Fragment中调用Activity中的getActivity()
2)在Activity中调用Fragment中的方法,接口回调
3)在Fragment中调用Fragment中的方法findFragmentById
6. Fragment的replace、add、remove
- replace替换实例
- add添加实例
- remove移除实例
Service
1.Service是什么
Service是一个一种可以在后台执行长时间运行,无界面的应用组件。
运行在主线程,不能进行耗时操作
2.Service和Thread的区别
定义
Thread是程序执行的最小单位,Service是安卓的一种运行机制。
实际开发
Thread作耗时操作,Service运行主线程
应用场景
Service音乐,导航
3.Service启动方式
1. startService
1)定义一个类继承Service
2)在Mainfest.xml文件中配置该Service
3)使用Context的startService(Intent)方法启动该Service
4)不再使用时,调用stopService(Intent)方法停止该服务
2. bindService
1)创建BindService服务端,继承自Service并在类中,创建一个实现IBinder接口的实例对象并提供公共方法给客户端调用
2)从onBind()回调方法返回此Binder实例
3)在客户端中,从onServiceConnected()回调方法中接受Binder,并使用提供的方法调用绑定服务。
Broadcast receiver
1.广播的定义
在安卓中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制,广播内容是一个Intent,这个Intent中可以携带我们要传送的数据。
2.广播的使用场景
- 同一个app具有多个进程的不同组件之间的消息通信
- 不同app之间的组件之间消息通信
3.广播的种类
1)Normal Broadcast:Context.sendBroadcast
2)System Broadcast:Context.sendOrderedBroadcast
3)Local Broadcast:只在自身app内传播
4.实现广播-receiver
1)静态注册:注册完成就一直运行
2)动态注册:跟随activity的生命周期(要回收,不然会内存泄漏)
区别:前者mainfest添加,app杀死后依然运行,后者代码添加,跟随activity的生命周期。
5.内部实现机制
1)自定义广播接受BroadcastReceiver,并复写onRecvice()
2)通过Binder机制向AMS进行注册
3)广播发送者通过Binder机制向AMS发送广播
4)AMS查找符合相应条件(intentFilter/Permission)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是activity)相应的消息循环队列中
5)消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法
5.LocalBroadcastManager详解
1)使用它发送的广播只在自身app中传播,因此不必担心泄漏隐私数据
2)其他App无法对你的App发送该广播,因为你的App根本不可能接受到非自身的广播,因此不用担心有安全漏洞
3)比系统的全局广播更加高效
注册
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
if(savedInstanceState!=null) {
if(mLocalBroadcastManager!=null && mBoradCast!=null) {
mLocalBroadcastManager.unregisterReceiver(mBoradCast);
mLocalBroadcastManager=null;
mBoradCast=null;
}
}
mLocalBroadcastManager=LocalBroadcastManager.getInstance(this);
mBoradCast = new MyBroadCast(); IntentFilter intentFilter = new IntentFilter();
//重点在这里,本地注册,本地接收。
mLocalBroadcastManager.registerReceiver(mBoradCast, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mLocalBroadcastManager!=null && mBoradCast!=null) {
mLocalBroadcastManager.unregisterReceiver(mBoradCast);
mLocalBroadcastManager=null;
mBoradCast=null;
}
}
*发送
LocalBroadcastManager lcm=LocalBroadcastManager.getInstance(mContext);
lcm.sendBroadcast(new Intent(ACTION_LOCATION));//发送
Binder详解
1. 相关Linux的基础知识
1.1 进程隔离/虚拟地址空间
1.2 系统调用
1.3 binder驱动
2. Binder通信机制
2.1 为什么要使用binder
- android使用的Linux内核拥有非常多的跨进程通信机制
- 性能
- 安全(双方身份校验)
2.2 binder通信机制
- 通信录:ServiceManager
-
通信基站:binder驱动
binder通信机制.png
2.3 到底什么是binder
- 通常意义下,Binder指的是一种通信机制
- 对于Server进程来说,Binder指的是Binder本地对象
- 对于Client进程来说,Binder指的是Binder代理对象
- 对于传输过程而已,Binder是可以进行跨进程传递的对象
Handler详解
什么是handler
- 安卓消息机制的上层接口,可以用来更新ui
- handler通过发送和处理Message和Runnable对象来关联对应线程的MessageQueue。
- 可以让对应的Message和Runnable在未来的某个时间点进行相应处理
- 让自己想要处理的耗时操作放在子线程,让更新ui的操作放在主线程
handler的使用方法
- post(runnable)
- sendMessage(message)
handler机制的原理
handler.pnghandler发送消息,处理Looper对象。
handler引起的内存泄漏以及解决办法
原因:非静态内部类持有外部类的匿名引用,导致外部activity无法释放
解决办法:handler内部持有外部activity的弱引用,并把handler改为静态内部类,mHandler.removeCallback()
AsynkTask详解
什么是AsynkTask
本质上是一个封装了线程池和handler的异步框架,只能做一些耗时比较短的操作。
AsynkTask的使用方法
3个参数
5个方法
onPreExecute():做一些准备工作
doInBackground():做耗时操作
onProgressUpdate():显示进度条的变化
onPostExecute():返回结果
AsynkTask的机制原理
- AsynkTask的本质是一个静态的线程池,AsynkTask派生出的子类可以实现不同的异步任务,这些任务都是提交到静态的线程池中执行
- 线程池中的工作线程执行doInBackground(mParams)方法执行异步任务
- 当任务状态发生改变之后,工作线程会向ui线程发送消息,AsynkTask内部的internalHandler响应这些消息,并调用相关的回调函数。
AsynkTask的注意事项
- 内存泄漏:非静态内部类持有外部类的匿名引用,导致外部activity无法释放。
- 生命周期:onDestory()方法中调用AsynkTask.cancel()
- 结果丢失:屏幕旋转,activity重新创建等,AsynkTask会持有之前的activity的引用。
- 并行or串行:
HandlerThread的理解
HandlerThread的产生背景
- 开启Thread子线程进行耗时操作
- 多次创建和销毁线程是很耗系统资源的
HandlerThread的是什么
handler+thread+looper
是一个thread内部有looper
HandlerThread的特点
- 本质上是一个线程类,他继承了Thread
- HandlerThread有自己的内部Looper对象,可以进行looper循环
- 通过获取HandlerThread的looper对象传递给Handler对象,可以在handlerMessage方法中执行异步任务
- 优点是不会有堵塞,减少了对性能的消耗,缺点是不能同时进行多任务的处理,需要等待进行处理,处理效率较低
- 与线程池注重并发不同,HandlerThread是一个串行队列,HandlerThread背后只有一个线程。
IntentService的理解
IntentService是什么
- 继承了Service,优先级比Service高。
- 它内部通过HandlerThread和Handler实现异步操作
- IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。另外,可以启动IntentService多次,而每一个耗时操作会以工作队列的方式在IntentService的onHandlerIntent回调方法中执行,并且,每次只执行一个工作线程,执行完一个再执行第二个。
网友评论