Activity
一 生命周期
4种状态 running / paused / stopped / killed
生命周期
Activity启动 onCreate -> onStart -> onResume
点Home返回主界面 onPause -> onStop
再次回到原Activity onRestart -> onStart -> onResume
退出Activity onPause -> onStop -> onDestroy
进程优先级 前台/可见/服务/后台/空
二 任务栈
三 启动模式
standard
singleTop 栈顶复用
singleTask 栈内复用
singeInstance
四 scheme跳转协议
服务器可以定制化告诉App跳转哪个页面,可以通过通知栏消息定制化跳转页面,可以通过H5页面跳转页面
Fragment
一 第五大组件
为什么是第五大组件 Fragment相对Activity更节省内存,切换更舒适
Fragment加载到Activity的两种方式
静态加载 xml
动态加载 fragmentTransaction.add(id, fragment, “name”); .commit;
FragmentPagerAdapter与FragmentStatePagerAdapter
FragmentStatePagerAdapter在切换时回收内存,适合页面较多的情况
FragmentPagerAdapter并没有回收内存,只是detach了Activity
二 生命周期
onAttach -> onCreate -> onCreateView -> onViewCreated -> onActivityCreated -> onStart -> onResume
-> onPause -> onStop -> onDestroyView -> onDestroy -> onDetach
先创建Activity后创建Fragment,先销毁Fragment后销毁Activity
三 Fragment之间的通信
Fragment调用Activity getActivity
Activity调用Fragment 接口回调
Fragment调用Fragment方法 findFragmentById
四 FragmentManager
replace
add
remove
Service
一 应用场景,与Thread区别
Service是什么 后台长时间运行,没有用户界面,运行在主线程,不能有耗时操作
Service与Thread区别 Activity难以与Thread交互,尤其当Activity销毁以后
二 开启Service的两种方式
StartService
onCreate -> onStartCommand -> onBind -> onDestroy
onStartCommand return START_STICKY;
startService(intent); stopService(intent);
BindService
Broadcast
一 广播
定义
场景 可在同一个App多个进程间消息传递,可在不同App间消息传递
种类 Normal, System有序广播, Local本地广播
二 实现方式
静态注册 注册完一直运行
动态注册 跟随Activity生命周期
三 实现机制
四 本地广播 LocalBroadcastManager
由于之前的广播都是全局的,所有应用程序都可以接收到,这样就很容易会引起安全性的问题,比如说我们发送一些携带关键性数据的广播有可能被其他的应用程序截获,或者其他的程序不停地向我们的广播接收器里发送各种垃圾广播。
为了能够简单地解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收来自应用程序发出的广播,这样所有的安全性问题就都不存在了。
异步消息处理
Handler
子线程发送消息,让主线程更新UI
handler使用方法 post(runnable)与sendMessage(message)
handler内存泄漏解决办法:1. handler改为静态内部类 2.handler内部持有Activity外部弱引用
3. mHandler.removeCallback()
HandlerThread
多次创建销毁线程很耗费系统资源
本质上是线程, 继承自Thread,同时自己内部拥有Looper对象,可以进行Looper循环
串行队列,不能同时多任务处理,需要等待
handlerThread = handler + thread + looper
AsyncTask
本质上封装了线程池和Handler
传入三个参数 xxxAsyncTask extends AsyncTask<Integer, Integer, String> 使用参数,进度参数,结果参数
onPreExecute 在UI线程里执行
doInBackground 返回参数传给onPostExecute,中间publishProgress(i)中的参数传给onProgressUpdate
onProgressUpdate 在UI线程里执行
onPostExecute 在UI线程里执行
xxxAsyncTask.cancel()
并行or串行?为了线程池稳定,系统默认串行,一般建议串行,用xxxAsyncTask.executeOnExecutor执行并行
IntentService
IntentService是串行的
onHandleIntent 执行耗时操作
IntentService内部封装了HandlerThread框架,利用HandlerThread进行异步消息传递
WebView
API16之前,没有限制WebView.addJavascriptInterface(),攻击者利用反射可执行任意Java对象的方法。
onDestroy销毁WebView时,先要从父视图里remove WebView, 再调用WebView.removeAllViews()和WebView.destroy(),避免内存泄漏,WebView中的Context使用弱引用。
jsbridge 通过JS构建起的桥
WebView硬件加速导致页面渲染问题
Binder
Linux的进程间通信有Pipe, Socket,共享内存,信号量,信号,报文。
但是出于性能和安全考虑,Android引入了Binder机制。
Binder驱动位于内核空间,两个位于用户空间的进程间的通信,必须使用到Linux系统调用。
Binder对象是一个跨进程通信的对象,由Binder驱动实现。
进程通过Binder驱动向Service Manager注册,Service Manager维护一张表。
进程A从Service Manager里查询进程B,Service Manager返回一个代理对象,
代理对象通过Binder驱动实现,将结果返回给Service Manager。
Android构建
将资源文件通过aapt编译生成R.java,将aidl文件通过aidl编译生成Java接口
将App源码 + R.java + aidl的Java接口,通过Java编译器生成.class字节码文件
将.class通过dex生成.dex文件(虚拟机Dalvik可执行文件)
将.dex + 其它未编译文件通过apkbuilder生成apk
将apk通过签名工具jarsigner进行签名
将apk通过zipalign进行对齐操作,节省内存开销,减少apk大小
OKHttp
使用方法
创建一个OKHttpClient对象
创建一个Request对象(通过内部类Builder调用生成)
创建一个Call对象,调用execute(同步请求) / enqueue(异步请求)
WebSocket心跳原理
心跳包中可能会携带数据
当收到Ping帧的时候需要立即返回一个Pong帧
在连接建立之后,随时都可以发送Ping帧
心跳是用来测试链接是否存在和对方是否在线
在响应Ping帧的的Pong帧中,必须携和被响应的Ping帧中相同的数据
其他要点
App架构设计
MVC / MVP / MVVP 各自优缺点与应用
框架选型,包括网络框架,图片框架,总线框架等
第三方库选型,包括推送,定位,统计,图表等
compiledSDK / minimunSDK / targetSDK 尤其是targetSDK
屏幕适配的各种方案,包括dp/sp,图片, 静态布局注意点,动态布局等
网络安全技术,包括数据存储,数据加密(哈希,对称,非对称),HTTPS