1. Activity的四种启动方式
设置:在AndroidManifest.xml中<activity>
标签设置android:launchMode
属性
- standard:默认模式,默认创建一个新的实例
- singleTop:栈顶复用模式,若启动的Activity已位于栈顶,不会重新创建,而调用其
onNewIntent
方法(适合接收通知启动的内容显示页面,如新闻内容页面) - singleTask:栈内复用模式,若存在会将其上的其他Activity销毁并调用
onNewIntent
(作为程序入口点,如浏览器主界面) - singleInstance:单实例模式,会单独位于一个任务栈中(适合与程序分离的页面,如闹铃提醒)
2. Android消息机制
(1)Looper.prepare()
在本线程中保存一个Looper实例,其中保存一个MessageQueue对象
(2)Looper.loop()
会让当前线程进入一个无限循环,不断从MessageQueue中读取消息,回调msg.target.dispatchMessage(msg)
方法
(3)Handler的构造方法会得到当前线程中的Looper实例,进而关联其中的MessageQueue
(4)Handler的sendMessage()
方法会将msg.target赋值为handler自身,再加入MessageQueue中
(5)构造Handler实例时我们会重写handleMessage()
方法,即msg.target.dispatchMessage(msg)
最终调用的方法
3. Service和IntentService的区别
Service:当应用程序被挂到后台时,为保证某些组件仍可工作而引入了service,它依赖于应用程序的主线程,耗时逻辑和操作会引起ANR
IntentService:继承于Service,在onCreate时内部开启了一个线程执行耗时操作,完成后会清理线程并关闭服务。
(1)创建了一个独立的工作线程来处理所有传递给服务的intents(通过onStartCommand()
)
(2)创建了一个工作队列,逐个发送intent给onHandleIntent()
(3)无需主动调用stopSelf()
来结束服务,所有intent处理完后会自动关闭服务
(4)默认实现的onBind()
返回null
(5)默认实现的onStartCommand()
的目的是将intent插入到工作队列中
4. 自定义view的几种方式
(1)组合空间:讲几个控件组合成为新的控件,如自定义标题栏
(2)自绘控件:继承View重写onDraw()
方法,用于实现一些不规则的效果
(3)继承控件:继承已有的控件,扩展其功能
5. Android动画的几种方式
(1)视图动画:也叫Tween补间动画,可在一个视图容器内执行一系列简单变换(位置、大小、旋转、透明度等),使用插值器Interpolator改变动画播放速率
- ScaleAnimation 缩放动画
- TranslateAnimation 位移动画
- RotateAnimation旋转动画
- AlphaAnimation 透明度动画
(2)帧动画AnimationDrawable:通过多张Drawable实现像幻灯片一样的效果
<animation-list>
<item
android-drawable="mipmap/pic"
android-duration="500"/>
<animation-list>
(3)属性动画:修改控件的属性实现的动画
- ValueAnimator:一个特定时间内执行一个动画
- TimeAnimator:时序监听回调工具
- ObjectAnimator:一个对象的一个属性动画
- AnimatorSet:动画集合
6. 进程间通信方式
(1)Bundle:四大组件间传递数据
(2)文件共享:适用并发程度不高,实时性要求不高,如缓存共享
(3) AIDL:远程服务跨进程通信的一种方式
(4)Messenger:通过message进行传输,低并发的一对多及时通信
(5)ContentProvider:一对多的进程间数据共享
(6)Socket:网络数据交换
7. 线程间通信方式
(1)共享内存(变量)
(2)文件、数据库
(3)Handler
(4)Java中的wait()
,notify()
,notifyAll()
8. 更新UI的几种方式
(1)runOnUiThread(Runnable)
(2)View.post(Runnalbe)
/new Handler.post(Runnable)
(3)使用Handler
(4)使用AsyncTask
9. 序列化相关,如何序列化,为什么要序列化
-
序列化的目的
(1)永久保存对象数据(保存于文件中等)
(2)将对象数据在网络上传输(对象数据转换为字节流)
(3)将对象数据在进程间传递(intent.putExtra("name", user)
,budle.putSerializable("name", user)
) -
如何序列化
(1)实现Serializable接口,声明即可。
指定一个serialVersionUID用于辅助序列化和反序列化
(2)实现Parcelable接口,声明+实现内部相应方法
10. 触摸事件传递流程
传递:Activity→ViewGroup→View
处理:View→ViewGroup→Activity
在未重写任何方法的情况下,触摸事件的派遣将不会被截断,自上而下派遣到叶子View,调用该View的onTouchEvent()
(若注册了监听器,则优先调用onTouchListener.onTouch()
,返回false才会调用onTouchEvent()
)。如果该View不能处理事件(onTouchEvent()
返回false),其父视图继续尝试处理,直到最后调用Activity的onTouchEvent()
方法。
11.数据持久化
(1)文件存储
(2)SharedPreferences存储
(3)SQLite数据库存储