Android琐碎知识

1.一个App有多少个Context

应用程序创建Context实例的情况有如下几种情况:

  1. 创建Application 对象时, 而且整个App共一个Application对象
  2. 创建Service对象时
  3. 创建Activity对象时

因此应用程序App共有的Context数目公式为:

总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)  

2.getApplication 和getApplicationContext有什么区别

相同点

二者使用结果相同,我们写个代码分别打印二者返回结果,发现两个方法获取的是同一个对象。

public class   MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Application application = getApplication();
    Log.i("WY", "打印getApplication:" + application);
    Context pContext = getApplicationContext();
    Log.i("WY", "打印getApplicationContext:" + pContext);
}
}

不同点

  1. getApplication()是用来获取Application实例的,getApplicationContext是用来获取Application的上下文。
  2. getApplication只在Activity和Service中才能调用
  3. 在BroadcastReceiver中获取Application实例,需要使用getApplicationContext()方法

3.设置configChanges避免横竖屏切换Activity重建

//当minSsdkVersion 和 targetSdkVersion高于13时,需要增加screenSize
android:configChanges="oriention | screenSize"

4.Android中的多进程

  1. 进程名以“:”开头的进程属于当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中
  2. 进程名不以“:”开头的进程属于全局进程,其他应用可以通过ShareUID方式和它跑在同一个进程中。(需要这两个应用有相同的ShareUID并且签名相同)

  3. 多进程存在的问题

(1)静态成员和单例模式完全失效;
(2)线程同步机制完全失效;
(3)SharedPreferences的可靠性下降;
(4)Application会多次创建。

4.序列化Serializable

1.serialVersionUID作用
序列化的时候系统会把当前类的serialVersionUID写入序列化文件中,当反序列化的时候系统会去检测文件中的serialVersionUID,看它是否和当前类的serialVersionUID一致,如果一致说明序列化的类的版本和当前类的版本是相同的,这个时候可以成功反序列化;否则说明当前类的和序列化的类相比发生了某些变换,比如成员变量的数量、类型可能发生了变换,这个时候是无法正常反序列化的,并且会报错java.io.InvalidClassException.