第二行代码学习笔记——第二章(2)
2017-02-27 20:03
387 查看
Android生命周期和启动模式
学习Activity生命周期可以使程序更加连贯流畅,而且有利于合理的管理应用的资源
1、返回栈
Android中的Activity是可以层叠的,每启动一个新的活动就会覆盖在原活动之上,然后点击返回会销毁最上面的活动,下面的一个活动就会重新显示出来。Android是使用任务(TASK)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称为返回栈。
2、活动状态
每个Activity在其生命周期中最多有四种状态2.1 运行状态
Activity位于返回栈栈顶2.2 暂停状态
Activity不在处于栈顶,但是可见2.3 停止状态
Activity不处于栈顶,也完全不可见2.4销毁状态
Activity从返回栈中移除3 Activity生命周期
3.1 onCreate()
Activity第一次被创建的时候调用3.2 onStart()
Activity由不可见变为可见的时候调用3.3 onResume()
此时Activity一定处于栈顶,并且处于运行状态3.4 onPause()
系统准备启动或恢复另一个活动的时候调用。在这个方法中可以释放一些耗CPU的资源,保存一些关键数据,但是需要保证不会影响新的栈顶活动的使用3.5 onStop()
在Activity完全不可见的时候调用3.6 onDestroy()
活动被销毁之前调用3.7 onRestart()
由停止状态变为运行状态时调用3.8 除了onRestart()方法外,其他方法都是两两相对的,所以有可以分为三种生存期。
3.8.1 完整生存期onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。
一般在OnCreate()方法中完成初始化操作,在onDestroy()中完成释放内存操作
3.8.2 可见生存期
onStart()到onStop()之间所经历的,就是可见生存期
这个期间内,Activity对于用户总是可见的,用这两个方法合理地管理用户可见资源
3.8.3 前台生存期
onResume()到onPause()之间经历的。
3.9 活动被回收了怎么办
当活动进入到了停止状态,就是有可能被回收的。Activity为我们提供了相应的方法可以保存和恢复Activity销毁之前的数据。(项目中一直没有遇到过需要保存活动被销毁前的数据的情况)3.9.1 onSaveInstanceState()方法
该方法保证在活动销毁之前一定会被调用。它会携带一个Bundle类型的参数,Bundle用于保存数据。
@Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //保存数据 String name = "answer"; outState.putSerializable("name", name); }
3.9.2 恢复数据
onCreate() 方法中有一个Bundle参数,正常情况下该Bundle为空。当执行过onSaveInstanceState() 方法后,Bundle为onSaveInstanceState() 保存的数据。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "onCreate: "); setContentView(R.layout.activity_main); if(savedInstanceState != null) { //有数据 String name = savedInstanceState.getString("name"); } }
4 活动的启动模式
启动模式一共有四种,实际应用中根据不同的需要选择不同的启动模式。可以在< activity >标签中指定启动模式 android:launchMode = “XXXX”<activity android:name=".RemindActivity" android:launchMode="standard"></activity>
4.1 standard
standard是Activity默认的启动模式。每当启动一个新的Activity,它就会在返回栈中入栈,并处于栈顶位置,不会在乎这个Activity是否已经在返回栈中存在,每次启动都会创建新的实例。
4.2 singleTop
在启动Activity时,如果发现返回栈的栈顶已经是该Activity则直接使用它,不会再创建新的Activity实例。4.3 singleTask
可以很好的解决重复创建栈顶活动的问题。每次启动Activity时,系统会先检查在返回栈中是存在该活动的实例,如果存在则直接使用该实例,并将这个Activity之上的所有Activity出栈。如果没有该实例则创建一个新的活动实例。
4.4 singleInstance
指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个活动。可以解决共享Activity实例的问题。5 Activity最佳实践
5.1 知晓当前是哪一个Activity
让所有Activity都继承与自定义的BaseActivity类,在BaseActivity中调用getClass.getSimpleName()方法,就可知道当前所在的是那个Activity了5.1.1 创建一个BaceActivity类,继承于AppCompatActivity,并重写onCreate()方法。但是不用在AndroidManifest中注册,也不用关联layout。
public class BaseActivity extends AppCompatActivity{ private static final String TAG = "BaseActivity"; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //获取当前所在的Activity Log.i(TAG, "当前所在的Activity : " + getClass().getSimpleName()); } }
5.1.2 令其他Activity类都继承BaseActivity
public class MainActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
5.1.3 运行效果
5.2 随时退出程序
在有需要的情况下实现直接关闭所有Activity,退出程序5.2.1 新建一个集合类对所有的Activity进行管理
在Activity管理类ActivityCollector中,通过List来暂存Activity,用addActivity()方法加入Activity, removeActivity()方法移出Activity,用finishAll()方法关闭所有Activity。
public class ActivityCollector { public static List<Activity> activityList = new ArrayList<>(); /** * 添加一个Activity * @param activity Activity类 */ public static void addActivity(Activity activity) { activityList.add(activity); } /** * 移除一个Activity * @param activity Activity类 */ public static void removeActivity(Activity activity) { activityList.remove(activity); } /** * 关闭所有Activity */ public static void finishAllActivity() { for(Activity activity : activityList) { if(activity != null) { activity.finish(); } } } }
5.2.2 在BaseActivity中使用ActivityCollector中的方法
在onCreate()方法中使用addActivity()方法,将Activity加入List中。在onDestroy()中使用removeActivity()方法,将Activity移出List。
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); //获取当前所在的Activity Log.i(TAG, "当前所在的Activity : " + getClass().getSimpleName()); ActivityCollector.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); ActivityCollector.removeActivity(this); }
5.3.3 在需要退出应用的地方调用finishAllActivity()方法
这里写代码片
注:最佳实践的demo下载地址:
http://download.csdn.net/detail/android_03/9766625相关文章推荐
- 第二行代码学习笔记——第二章:先从看得到的入手——探究活动
- 第二行代码学习笔记——第二章:先从看得到的入手——探究活动
- 第二行代码学习笔记——第二章(1)
- Material Design 学习之Toolbar(第二行代码笔记)
- 第一行代码学习笔记-第二章 探究活动-3.活动的生命周期
- 第二行代码学习笔记——第十章:后台默默的劳动者——探究服务
- 第一行代码学习笔记-第二章 探究活动-4.活动的启动模式
- 第一行代码学习笔记-第二章 探究活动-1.活动的基本用法
- 第二行代码学习笔记——第十二章:最佳的 UI 体验——Material Design 实战
- 第二行代码学习笔记之第一章
- 第一行代码学习笔记第二章——探究活动
- 第二行代码学习笔记之第一章
- 第二行代码学习笔记——第五章:全局大喇叭——详解广播机制
- 第二行代码学习笔记——第一章:开始启程——你的第一行Android代码
- 第二行代码学习笔记——第十一章:Android特色开发——基于位置的服务
- 第一行代码学习笔记-第二章 探究活动-2.Intent的使用
- 第二行代码学习笔记——第六章:数据储存全方案——详解持久化技术
- 第二行代码学习笔记——第七章:跨程序共享数据——探究内容提供器
- 第二行代码学习笔记——第九章:看看精彩的世界——使用网络技术
- 第二行代码学习笔记——第八章:丰富你的程序——运行手机多媒体