Intent可转递的数据类型
- 8 种数据类型(byte、char、short、int、long、float、double、boolean)及其数组;
- String(String实现了 Serializable)/CharSequence 实例类型的数据及其数组;
- 实现了 Parcelable 的对象及其数组;
- 实现了 Serializable 的对象及其数组;
- File在Java里也是类,在Android里也实现了Serializable接口;
Serializable :将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用ObjectInputStream 和 ObjectOutputStream 进行对象的读写;
引入了CharSequence接口,实现了这个接口的类有:CharBuffer、String、StringBuffer、StringBuilder这个四个类;
Parcelable和Serializable 俩者异同
- Serializable在序列化的时候会产生大量的临时变量,从而引起频繁的GC;
- 在使用内存的时候,Parcelable比Serializable性能高,所以推荐使用Parcelable。
- Parcelable不能使用在要将数据存储在磁盘上的情况,因为Parcelable不能很好的保证数据的持续性在外界有变化的情况下。尽管Serializable效率低点,但此时还是建议使用Serializable 。
Android dvm
- Android 运行时由两部分组成: Android 核心库集和 Dalvik 虚拟机。其中核心库集提供了 Java 语言核心库所能使用的绝大部分功能,而虚拟机则负责运行 Android 应用程序。
- 每个 Android 应用程序都运行在单独的 Dalvik 虚拟机内(即每个 Android 应用程序对用一条 Dalvik 进程), Dalvik 专门针对同时高效地运行多个虚拟机进行优化,因此 Android 系统以方便的实现对应用程序进行隔离。
- DVM指dalivk的虚拟机,每一个Andriod应用程序都在它自己的进程中运行,都拥有一个独立的Dalivk虚拟机实例,而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念
在同一线程中android.Handler和android.MessaegQueue的数量对应关系
- Handler 必须在 Looper.prepare() 之后才能创建使用,其中就生成一个 MessageQueue;
- Looper 与当前线程关联,并且管理着一个 MessageQueue;
- Message 是实现 Parcelable 接口的类;
- 以一个线程为基准,他们的数量级关系是: Handler(N) : Looper(1) : MessageQueue(1) : Thread(1);
Activty启动模式
- standard模式。哪里需要调用我我就去哪里,可以多次实例化,可以几个相同的Activity重叠;
- singleTop模式。可以多次实例化,但是不可以多个相同的Activity重叠,当堆栈的顶部为相同的Activity时,会调用onNewIntent函数;
- singleTask模式。同一个应用中调用该Activity时,如果该Activity没有被实例化,会在本应用程序的Task内实例 化,如果已经实例化,会将Task中其上的Activity销毁后,调用onNewIntent;其它应用程序调用该Activity时,如果该 Activity没有被实例化,会创建新的Task并实例化后入栈,如果已经实例化,会销毁其上的Activity,并调用onNewIntent。一句 话,singleTask就是“独立门户”,在自己的Task里,并且启动时不允许其他Activity凌驾于自己之上;
- singleInstance模式。加载该Activity时如果没有实例化,他会创建新的Task后,实例化入栈,如果已经存在,直接调用 onNewIntent,该Activity的Task中不允许启动其它的Activity,任何从该Activity启动的其他Activity都将被 放到其他task中,先检查是否有本应用的task,没有的话就创建;
Android获取屏幕宽度的4种方法
方法一
1
2
3
4WindowManager wm = (WindowManager) this
.getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();方法二
1
2
3WindowManager wm1 = this.getWindowManager();
int width1 = wm1.getDefaultDisplay().getWidth();
int height1 = wm1.getDefaultDisplay().getHeight();方法一与方法二获取屏幕宽度的方法类似,只是获取WindowManager 对象时的途径不同。
方法三
1
2
3
4
5WindowManager manager = this.getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int width = outMetrics.widthPixels;
int height = outMetrics.heightPixels;方法四
1
2
3
4
5Resources resources = this.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
float density = dm.density;
int width = dm.widthPixels;
int height = dm.heightPixels;
Broadcast Receiver专注于接收广播通知消息
- 由于BroadcastReceiver本质上是一种监听器,所以创建BroadcastReceiver的方法也非常简单,只需要创建一个BroadcastReceiver的子类然后重写onReceive (Context context, Intentintent)方法即可;
- BroadcastReceiver的生命周期,从对象调用它开始,到onReceiver方法执行完成之后结束。另外,每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver方法中执行完就销毁,如果BroadcastReceiver的onReceiver方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver方法中执行耗时的操作;
Android有5种布局
- FrameLayout
- LinearLayout
- TableLayout
- RelativeLayou
- AbsoluteLayout
用于对单选框进行分组的方法
- 单选框操作:单选框在Android里面随处可见,它是由两部分组成的,一部分是RadioGroup,一部分是RadioButton。一个RadioGroup里面是有多个RadioButton。每个RadioButton就是一个单选项,而控制的时候是控制RadioGroup;
- 复选框(checkBox):复选框就没有单选框那样有组的概念了,所以复选框的操作和单选框比起来就会比较复杂一点点,因为你要对每个复选框都进行一个事件响应;
进程的种类
- 前台进程
- 可见进程
- 服务进程
- 后台进程
- 空进程
编写Aidl文件时,需要注意下面几点
- 接口名和aidl文件名相同;
- 接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static;
- Aidl默认支持的类型包话java基本类型(int、long、boolean等)和(String、List、Map、 CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型作 为参数或返回值,自定义类型必须实现Parcelable接口;
- 自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中;
- 在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数;
- Java原始类型默认的标记为in,不能为其它标记;
android中使用SQLiteOpenHelper辅助类
- Android使用 getWritableDatabase() 和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。(getReadableDatabase()方法中会调用getWritableDatabase()方法)
- getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才以只读方式打开数据库.。
- 但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写;
- getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,
倘若使用如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库;
Android系统资源池
- Message提供了消息池,有静态方法Obtain从消息池中取对象;
- Thread默认不提供资源池,除非使用线程池ThreadPool管理;
- AsynTask是线程池改造的,池里 默认提供(核数+1)个线程进行并发操作,最大支持(核数 * 2 + 1)个线程,超过后会丢弃其他任务;
- Looper,每个Looper创建时创建一个消息队列和线程对象,也不是资源池;
IntentService与Service的关系
- IntentService是继承Service的,那么它包含了Service的全部特性,当然也包含service的生命周期;
- IntentService在执行onCreate操作的时候,内部开了一个线程,去你执行你的耗时操作;
1 | When to use? |
SimpleAdapter作为 ListView的适配器
- 使用SimpleAdapter作为适配器时,支持三种类型的 View,而且是按照如下顺序进行匹配:
- 继承Checkable接口;
- TextView;
- ImageView;