Java 中赋值表达式的返回值

起因

写代码的时候脑子里想着

如果 flag = true 则 do something …

于是手上跟着敲出

1
2
3
if (flag = true) {
// do something ...
}

编译器没有报错,当时思想走神也丝毫没有发觉这是一段弱智代码,调试的时候发现 if 里的语句每次都执行了,觉得不太对劲,然而仍然没有发现这段弱智代码有问题,本着格物致知的精神格了几分钟才发现这段代码应该是:

1
2
3
if (flag) {
// do something ...
}

瞬间觉得自己宛如智障

阅读更多

Android 中的 Parcelable 与 Serializable

1.作用

Serializable 的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi 以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。

而 Android 的 Parcelable 的设计初衷是因为 Serializable 效率过慢。为了在程序内不同组件间以及不同 Android 程序(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable 是通过 IBinder 通信的消息的载体。

2.区别

两者最大的区别在于存储媒介的不同,Serializable 使用 I/O 读写存储在硬盘上,而 Parcelable 是直接在内存中读写。很明显,内存的读写速度通常大于 I/O 读写,所以在 Android 中传递数据优先选择 Parcelable。

Serializable 会使用反射,序列化和反序列化过程需要大量的 I/O 操作,会在序列化的时候创建许多临时对象,容易触发GC。

Parcelable 自已实现封送和解封(marshalled & unmarshalled)操作不需要用反射,数据也存放在 Native 内存中,效率要快很多。

Android 启动模式

1.Standard

这个模式是默认的启动模式,即标准模式,在不指定启动模式的前提下,系统默认使用该模式启动 Activity ,每次启动一个 Activity 都会重写创建一个新的实例,不管这个实例存不存在,这种模式下,谁启动了该模式的 Activity ,该 Activity 就属于启动它的 Activity 的任务栈中。这个 Activity 它的 onCreate()onStart()onResume() 方法都会被调用。

2.SingleTop

这个模式下,如果新的 Activity 已经位于栈顶,那么这个 Activity 不会被重写创建,同时它的 onNewIntent() 方法会被调用,通过此方法的参数我们可以去除当前请求的信息。如果栈顶不存在该Activity的实例,则情况与 standard 模式相同。需要注意的是这个Activity它的 onCreate()onStart() 方法不会被调用,因为它并没有发生改变。

  • 当前栈中已有该 Activity 的实例并且该实例位于栈顶时,不会新建实例,而是复用栈顶的实例,并且会将 Intent 对象传入,回调 onNewIntent() 方法。
  • 当前栈中已有该 Activity 的实例但是该实例不在栈顶时,其行为和 Standard 启动模式一样,依然会创建一个新的实例。
  • 当前栈中不存在该 Activity 的实例时,其行为同 Standard 启动模式。

3.SingleInstance

该模式也是单例的,但和 SingleTask 不同, SingleTask 只是任务栈内单例,系统里是可以有多个 SingleTask Activity 实例的,而 SingleInstance Activity 在整个系统里只有一个实例,启动一 SingleInstanceActivity 时,系统会创建一个新的任务栈,并且这个任务栈只有他一个Activity。

4.SingleTask

该模式的 Activity 在同一个 Task 内只有一个实例,如果 Activity 已经位于栈顶,系统不会创建新的 Activity 实例,和 SingleTop 模式一样。但 Activity已经存在但不位于栈顶时,系统就会把该 Activity 移到栈顶,并把它上面的 Activity 出栈。