Activity是Android应用中负责与用户交互的组件,可以理解成Swing编程中的JFrame控件。多个Activity组成Activity栈,当前活动的Activity位于栈顶。
Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节,除了onRestart()方法,其他都是两两成对的。
完整生存期: 活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。
可见生存期: 活动在onStart()方法和onStop()方法之间所经历的就是可见生存期。在 可见生存期内,活动对于用户总是可见的,即便有可能无法和用户交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在onStart()方法中对资源进行加载,而在onStop()方法中对资源进行释放,从而保证处于状态的活动不会占用过多资源。
前台生存期: 活动在onResume()方法和onPause()方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户交互的。
比较快速,创建Intent后直接指定包名和类名即可。
不显示指定组件,通过动作、类型、数据匹配对应的组件。
每启动一个Activity就会在栈顶创建一个新实例。
如闹钟程序。
首先判断要启动的Activity实例是否位于栈顶,如果是则直接复用,否则创建新的实例。
如浏览器书签。
保证某个Activity在整个应用程序中只有一个实例。系统首先检查栈中是否存在当前实例,如果存在则直接使用,并把当前Activity之上的所有实例出栈,否则重新创建一个实例。
如浏览器主界面。
启动一个新的任务栈来管理Activity实例,无论从哪个任务栈启动该Activity,该实例在整个系统中只有一个(为了在不通程序中共享一个Activity实例)。
一种是要启动Activity不存在,则系统创建一个新任务栈,然后再创建Activity实例;
一种是要启动Activity已存在,无论当前Activity位于哪个程序哪个任务栈中,都把其所在任务栈转移到前台,从而使Activity显示。
如来电界面。
当Activity被部署在Activity应用中之后,随着应用程序的运行,Activity会不断地在不通的状态间切换,该Activity中特定的方法就会被回调,开发者可有选择性地重写这些方法来加入业务相关的处理。
(1)startActivity(Intent intent):启动其他Activity
(2)startActivityForResult(Intent intent,int requestCode):以指定请求码启动Activity,而且程序将会获取新启动的Activity返回的结果。
场景:发朋友圈时,进入图库选择好照片后,会返回到发表状态页面并带回所选图片信息。
(1)finish():结束当前Activity
(2)finishActivity(int requestCode):结束以startActivityForResult(Intent intent,int requestCode)方法启动的Activity。
requestCode可以实现数据回传,在当前Activity销毁时返回一个结果给上一个Activity。
使用步骤:
(1)在Activity1中开启Activity2
(2)在Activity2中添加返回的数据
(3)在Activity1中重写onActivityResult()方法得到返回的数据
在Activity之间传输的数据类型有基本类型、数组、Bundle、Serializable对象、Parcelable对象等,通过Intent来传输数据。
Intent intent = new Intent(this,OtherActivity.class);
intent.putExtra("name","Feng");
startActivity(intent);
须实现序列化接口
Intent intent = new Intent(this,OtherActivity.class);
Person p = new Person("李三",41);
intent.putExtra("p",p);
Intent intent = new Intent(this,OtherActivity.class);
Bundle b1 = new Bundle();
b1.putString("name","Feng");
b1.putString("age".25);
intent.putExtra("b1",b1);
1.已调用多个Activity后如何安全退出?
抛出异常强制退出(用户体验差)
记录打开的Activity并逐个关闭
需抽取到父类来实现,在父类的onCreate()方法中调用Activity集合的add()方法把每一个打开的Activity添加到集合中。当退出App时需要在父类中创建一个killAll()方法,在该方法中复制一份Activity集合,然后遍历复制后的集合来关闭所有Activity。
发送特定广播实现安全退出
在需要结束应用时发送一个特定的广播,每个Activity收到广播后关闭即可。
递归退出每个Activity
使用startActivityForResult()方法打开新Activity,需安全退出时自定义一个标志退出的Flag,在各Activity的onActivityResult()方法中处理这个Flag,来实现递归关闭。
2.如何应对后台的Activity被系统回收?
Activity被系统回收有3中情况: