广播
- 广播的类型
- 标准广播:异步执行
- 有序广播:同步执行
- 注册广播的方式
- 在代码中注册(动态注册)
- 在AndroidManifest.xml中注册(静态注册)
- 创建广播接收器
- 新建一个类,继承自BroadcastReceiver,并重写父类的onReceive()方法。
- 在onCreate()方法中调用registerReceiver()方法进行注册。
- 在onDestroy()方法中调用unregisterReceiver()方法取消注册。
数据存储
- 数据持久化技术
- 文件存储
- SharedPreference
- 数据库存储
- Context类中提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。
- 参数1:文件名
- 参数2:文件的操作模式
- MODE_PRIVATE(默认):覆盖原文件
- MODE_APPEND:往文件里追加
- 返回一个FileOutputStream对象
服务
- 服务是Android中实现程序后台运行的解决方案。
Android多线程编程
class MyThread extends Thread {
@Override
public void run() {
//
}
}
new MyThread().start();
class MyThread implements Runnable {
@Override
public void run() {
//
}
}
MyThread myThread = new MyThread();
new Thread(myThread).start();
new Thread(new Runnable() {
@Override
public void run() {
//
}
}).start();
异步消息处理机制
- Message
- Handler
- MessageQueue
- Looper
服务的基本用法
- onCreate()方法会在服务创建的时候调用
- onStartCommand()方法会在每次服务启动的时候调用
- onDestroy()方法会在服务销毁的时候调用
服务的生命周期
- 当调用了Context的startService()方法,相应的服务就会启动,并回调onStartCommand()方法。如果这个服务还没创建过,onCreate()方法会先于onStartCommand()方法执行。
- 可以调用Context的bindService()来获取一个服务的持久连接,这时会回调onBind()方法。如果这个服务还没创建过,onCreate()方法会先于onBind()方法执行。
- 当调用了startService()方法后,又调用stopService()方法,这时onDestroy()方法就会执行。
- 当调用了bindService()方法后,又调用unbindService()方法,onDestroy()方法也会执行。
- 既调用了startService()方法,又调用了bindService()方法,要同时调用stopService()和unbindService()方法,onDestroy()方法才会执行。
Activity
- onSaveInstanceState()用来保存Activity即将被销毁时的信息。
- Activity一共有以下四种launchMode:
- standard
- singleTop
- singleTask
- singleInstance
- id绑定应该在setContentView后执行。
Intent
- 隐式Intent
- 隐式的启动方式不需要通过指明明确的activity路径,而是通过action与系统匹配合适的activity在启动。
- Intent/Bundle 支持传递:
- 基本类型的数据和基本类型的数组数据;
- String/CharSequence类型的数据和String/CharSequence类型的数组数据;
- 传递Parcelable(包裹化,邮包)和Serializable(序列化)类型的数据,以及它们的数组/列表数据。File类实现了Serializable接口。
Broadcast Reveiver
- 由于BroadcastReceiver本质上是一种监听器,所以创建BroadcastReceiver的方法也非常简单,只需要创建一个BroadcastReceiver的子类然后重写onReceive(Context context, Intentintent)方法即可。BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作。如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成,但不能绑定Service。
Service
- 需要把进程移到前台的情况:
- 进程正在运行一个与用户交互的Activity,它的onResume()方法被调用
- 进程有一个Service,该Service对应的Activity正在与用户交互
- 进程有一个Service被调用startForeground()方法,要求到前台来执行
- 进程有一个Service,并且在Service的某个回调函数内有正在执行的代码
- 进程有一正在运行的BroadcastReceiver,它的onReceive()方法正在执行
- IntentService与Service的关系
- IntentService其实就是一个Service的实现类,启动方式都是startService。
布局文件
- Theme窗体级别,Style窗体元素级别,所以Theme作用在activity上。Theme被final修饰,是不可以被继承的。
- Android中图片视图的设置:
- scaleType:设置图片的填充方式
- adjustViewBounds:调整边框时是否保持可绘制对象的宽高比
- 用src来设置要展示的图片
- 主要在布局文件里配置
- GLSurFaceView的特性
- 管理一个surface。surface是一块特殊的内存,它可以和安卓的控件一起显示。
- 管理EGL。EGL是把OpenGL渲染在surface上的接口。
- 支持用用户自定义的Renderer对象进行渲染。
- 支持在自己专属的独立线程渲染,而不干扰主线程。
- 支持按需渲染和连续渲染。
- 可以封装、跟踪并且排查渲染器的问题。
- 1pt大概等于2.22sp。
- Android的动画类型:
- Tween(渐变动画)包含:alpha和scale;
- Frame(画面转换动画)包含:translate和rotate。
AndroidManifest.xml
- AndroidManifest.xml文件的作用
- 声明程序启动的第一个Activity
- 注册广播接收者
- 声明程序所要使用的权限
- 声明程序所包含的Activity及其对应的类
其他
- Android API level与对应的sdk版本
- API等级1: Android 1.0
- API等级2: Android 1.1 Petit Four 花式小蛋糕
- API等级3: Android 1.5 Cupcake 纸杯蛋糕
- API等级4: Android 1.6 Donut 甜甜圈
- API等级5: Android 2.0 Éclair 松饼
- API等级6: Android 2.0.1 Éclair 松饼
- API等级7: Android 2.1 Éclair 松饼
- API等级8: Android 2.2 - 2.2.3 Froyo 冻酸奶
- API等级9: Android 2.3 - 2.3.2 Gingerbread 姜饼
- API等级10:Android 2.3.3-2.3.7 Gingerbread 姜饼
- API等级11:Android 3.0 Honeycomb 蜂巢
- API等级12:Android 3.1 Honeycomb 蜂巢
- API等级13:Android 3.2 Honeycomb 蜂巢
- API等级14:Android 4.0 - 4.0.2 Ice Cream Sandwich 冰激凌三明治
- API等级15:Android 4.0.3 - 4.0.4 Ice Cream Sandwich 冰激凌三明治
- API等级16:Android 4.1 Jelly Bean 糖豆
- API等级17:Android 4.2 Jelly Bean 糖豆
- API等级18:Android 4.3 Jelly Bean 糖豆
- API等级19:Android 4.4 KitKat 奇巧巧克力棒
- API等级20: Android 4.4W KitKat with wearable extensions 奇巧巧克力棒
- API等级21:Android 5.0-5.0.2 Lollipop 棒棒糖
- DVM指dalivk的虚拟机,每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念。
- Android四大组件的回调函数都是在UI主线程执行的。
- 白屏时间first paint和可交互时间dom ready的关系。
- SQLiteOpenHelper辅助类
- Android使用getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。(getReadableDatabase()方法中会调用getWritableDatabase()方法)getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才以只读方式打开数据库。但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,倘若使用如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
- AlarmManager是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent。AlarmManager的常用方法有三个:
- (1)set(int type,long startTime,PendingIntent pi);该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。
- (2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。
- (3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。
- ContentResolver和ContentProvider是一对。一个运行在提供数据端(provider),一个运行在调用端(resolver)。使用的时候利用resolver来调用provider的方法(query,insert,update等),然后provider再进行数据查询。
- 构造对话框
- AlertDialog的构造方法被声明为protected,所以不能直接使用new关键字来创建AlertDialog类的对象实例。要想创建AlertDialog对话框,需要使用Builder类,该类是AlertDialog类中定义的一个内嵌类。因此必须创建AlertDialog.Builder类的对象实例,然后再调用show()来显示对话框。
- 因为ProgressDialog是继承于AlertDialog,调用的是AlertDialog的Builder方法。
- 在Android中,需要对数据进行存储,可以使用的方式:
- sharedpreference
- 数据库
- 文件
- Content Provider(ContentProvider一般为存储和获取数据提供统一的接口,可以在不同的应用程序之间共享数据。)
- 在安卓应用程序开发中,可以通过getMetrics()获得屏幕的属性,从而取得屏幕的高度和宽度。
- 进程的重要性和销毁顺序:
- 重要性依次是:前台进程,可见进程,服务进程,后台进程和空进程;所以销毁的顺序是逆方向。
- Android通过数字签名来标识应用程序的作者和在应用程序之间建立信任关系,不是用来决定最终用户可以安装哪些应用程序。这个数字签名由应用程序的作者完成,并不需要权威的数字证书签名机构认证,它只是用来让应用程序包自我认证的。
- 适合在客户端做数据持久化存储的数据的有:localStorage和userData。
- ServiceConnection接口的onServiceConnected()方法的触发条件
- bindService是异步调用和Service进行绑定, 如果绑定成功,则会调用ServiceConnection的onServiceConnected。当调用bindService方法后就会回调Activity的onServiceConnected,在这个方法中会向Activity中传递一个IBinder的实例,Acitity需要保存这个实例。
- 在同一线程中android.Handler和android.MessaegQueue的数量对应关系
- Handler 必须在 Looper.prepare() 之后才能创建使用
- Looper 与当前线程关联,并且管理着一个 MessageQueue
- Message 是实现 Parcelable接口的类
- 以一个线程为基准,他们的数量级关系是:Handler(N) : Looper(1) : MessageQueue(1) : Thread(1)。
- SharedPreferences他是安卓中的一个轻型的数据存储方式,它的本质是基于xml文件存储key-value键值对数据,通常适用于存储一些配置信息。使用步骤:
- 通过Context上下文来过去到SharePreferences对象
- 调用SharePreferences的edit()方法返回一个Editor对象
- 在通过Editor的putXXX(key , value);方法设置数据
- 在通过Editor的 commit(); 方法 关闭对象
- Android系统对哪些对象提供了资源池?
- Message提供了消息池,有静态方法Obtain从消息池中取对象;
- Thread默认不提供资源池,除非使用线程池ThreadPool管理;
- AsynTask是线程池改造的,池里默认提供(核数+1)个线程进行并发操作,最大支持(核数 * 2 + 1)个线程,超过后会丢弃其他任务;
- Looper,每个Looper创建时创建一个消息队列和线程对象,也不是资源池。
- AIDL:Android Interface Definition Language,即Android接口定义语言。
Android 使用AIDL提供公开服务接口,使得不同进程间可以相互通信。建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:
- (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件。该文件的语法类似于Java代码,但会稍有不同。
- (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java)。
- (3)建立一个服务类(Service的子类)。
- (4)实现由aidl文件生成的Java接口。
- (5)在AndroidManifest.xml文件中配置AIDL服务,尤其要注意的是,标签中android:name的属性值就是客户端要引用该服务的ID,也就是Intent类的参数值。
参考文献
- 《第一行代码Android》
- 《Android编程权威指南》