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种方法
- 方法一
WindowManager wm = (WindowManager) this
.getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();
int height = wm.getDefaultDisplay().getHeight();
复制代码
- 方法二
WindowManager wm1 = this.getWindowManager();
int width1 = wm1.getDefaultDisplay().getWidth();
int height1 = wm1.getDefaultDisplay().getHeight();
复制代码
方法一与方法二获取屏幕宽度的方法类似,只是获取WindowManager 对象时的途径不同。
- 方法三
WindowManager manager = this.getWindowManager();
DisplayMetrics outMetrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(outMetrics);
int width = outMetrics.widthPixels;
int height = outMetrics.heightPixels;
复制代码
- 方法四
Resources 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操作的时候,内部开了一个线程,去你执行你的耗时操作;
When to use?
The service can be used in tasks with no UI,but should not be too long.If you need to perform long tasks,you must use threads within Service.
The intentService can be used in long tasks with no communication to Main thread.
If communication is required,can use MainThread Handler to broadcast intents.
How to trigger?
Service is triggered bu calling startService();
IntentService is triggered when using an Intent,is spawns a new worker thread and the method onHandleIntent() is called on this thread.
Triggered from
The service and intent service may be triggered from any thread,activity to other application component.
Runs on
The service runs in background but it runs on the main thread of the application.
The intent service runs on a separate worker thread
Limitations/Drawbacks
The service may may block the main thread of the application
The intent service can not run tasks in parallel.Hence all consecutive intents will go into the message queue for the worker thread and will execute sequentially.
When to stop
If you implement a Service,it is yout responsibility to stop the service when its work is done,by calling stopSelf() or stopService().
The intentService will stop the service after all start requests have been handled,so you never have to call stopSelf();
复制代码
SimpleAdapter作为 ListView的适配器
- 使用SimpleAdapter作为适配器时,支持三种类型的 View,而且是按照如下顺序进行匹配:
- 继承Checkable接口;
- TextView;
- ImageView;