《个人平时笔记,看到的同学欢迎指正错误》
1、在我们经常在activity中调用finish()方法来结束销毁一个activity,其实调用finish()方法后它不一定就会马上执行onDestory()而销毁activity。
2、在activity的standard标准启动模式中,activity A 启动了standard模式的activity B,则activity B就会进入到activity A所在的任务栈中;如果用ApplicationContext去启动一个standard模式的activity,就会报错了,这是因为ApplicationContext并没有所谓的任务栈,解决方法就是启动的时候给新activity新创建一个任务栈,添加FLAG_ACTIVITY_NEW_TASK标记位。
singleInstance单实例模式,比较特殊,它具有singleTask的所有特性,也就是说只要在进程中任何任务栈已经存在将要启动的activity A的话,就不会创建新的activity A,就会进行复用,且保留singleTask的特性将让在activity A之上的所有activity出栈。
有一点注意标记位FLAG比在配置文件AndroidMainifest.xml中设置启动模式的优先级高。
3、Activity的生命周期
生命周期.png
4、在开发中我们经常会在UI线程中开启子线程去执行耗时操作然后使用Handler机制通信,这里是不建议这么操作的,操作不当容易造成内存溢出或NullPointException空指针;例如我们还没有执行完耗时操作就离开了当前页面,而没有结束子线程的行为,而子线程又持有外部UI的Handler引用。所以当有耗时操作是提倡异步任务AsyncTask执行。
线程同步锁(同步锁机制):A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求不到,怎么办,A线程只能等待下去。注意没有线程同步的说法。
线程异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程仍然请求的到,A线程无需等待。异步也可以理解为在主线程中开启一个子线程,而让子线程等待执行,主线程会继续执行下去不等待子线程;即开启一个子线程就是一个异步线程操作。
>1、 什么时候必须同步?什么叫同步?如何同步?
要跨线程维护正确的可见性,只要在几个线程之间共享非 final 变量,就必须使用synchronized(或volatile)以确保一个线程可以看见另一个线程做的更改。
小结:为了防止多个线程并发对同一数据的修改,所以需要同步,否则会造成数据不一致(就是所谓的:线程安全。如java集合框架中Hashtable和Vector是线程安全的。我们的大部分程序都不是线程安全的,因为没有进行同步,而且我们没有必要,因为大部分情况根本没有多线程环境)。
>2、进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
(1)线程是进程的一部分
(2)CPU调度的是线程
(3)系统为进程分配资源,不对线程分配资源