【精华】Android面试精华总结——Activity组件

一、Activity简介

  Activity是Android应用中负责与用户交互的组件,可以理解成Swing编程中的JFrame控件。多个Activity组成Activity栈,当前活动的Activity位于栈顶。

二、Activity生命周期

在这里插入图片描述
  Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节,除了onRestart()方法,其他都是两两成对的。

  完整生存期: 活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。
  可见生存期: 活动在onStart()方法和onStop()方法之间所经历的就是可见生存期。在 可见生存期内,活动对于用户总是可见的,即便有可能无法和用户交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在onStart()方法中对资源进行加载,而在onStop()方法中对资源进行释放,从而保证处于状态的活动不会占用过多资源。
  前台生存期: 活动在onResume()方法和onPause()方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户交互的。

三、Activity的启动方式

1.显式启动

比较快速,创建Intent后直接指定包名和类名即可。

2.隐式启动

不显示指定组件,通过动作、类型、数据匹配对应的组件。

四、Activity的4中启动模式

1.standard模式

  每启动一个Activity就会在栈顶创建一个新实例。
  如闹钟程序。

2.singleTop模式

  首先判断要启动的Activity实例是否位于栈顶,如果是则直接复用,否则创建新的实例。
  如浏览器书签。

3.singleTask模式

  保证某个Activity在整个应用程序中只有一个实例。系统首先检查栈中是否存在当前实例,如果存在则直接使用,并把当前Activity之上的所有实例出栈,否则重新创建一个实例。
  如浏览器主界面。

4.singleInstance模式

  启动一个新的任务栈来管理Activity实例,无论从哪个任务栈启动该Activity,该实例在整个系统中只有一个(为了在不通程序中共享一个Activity实例)。
  一种是要启动Activity不存在,则系统创建一个新任务栈,然后再创建Activity实例;
  一种是要启动Activity已存在,无论当前Activity位于哪个程序哪个任务栈中,都把其所在任务栈转移到前台,从而使Activity显示。
  如来电界面。

五、Activity的回调机制

  当Activity被部署在Activity应用中之后,随着应用程序的运行,Activity会不断地在不通的状态间切换,该Activity中特定的方法就会被回调,开发者可有选择性地重写这些方法来加入业务相关的处理。

六、Activity的启动与关闭

1.Activity的启动

  (1)startActivity(Intent intent):启动其他Activity
  (2)startActivityForResult(Intent intent,int requestCode):以指定请求码启动Activity,而且程序将会获取新启动的Activity返回的结果。
  场景:发朋友圈时,进入图库选择好照片后,会返回到发表状态页面并带回所选图片信息。

2.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传递数据

  在Activity之间传输的数据类型有基本类型、数组、Bundle、Serializable对象、Parcelable对象等,通过Intent来传输数据。

1.基本类型

Intent intent = new Intent(this,OtherActivity.class);
intent.putExtra("name","Feng");
startActivity(intent);

2.序列化对象

须实现序列化接口

Intent intent = new Intent(this,OtherActivity.class);
Person p = new Person("李三",41);
intent.putExtra("p",p);

3.大量数据

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中情况:

  • 每个手机的内存是有限制的,当Android系统发现内存不足时,它会将后台运行的一些应用程序杀死,回收这部分内存。
  • 如果没有对横竖屏切换的情况进行任何处理,那么在Activity进行横竖屏切换时,Activity会先被完全销毁回收,然后再被重建,导致页面数据丢失。
  • 当APP长期在后台运行时,有时出于省电等节省资源的目的,系统也会将APP回收掉。
      可以重写Activity的onSavedInstanceState()方法,将要保存的页面数据全部存到bundle对象中。下次再次进入这个Activity时就一定会调用onCreate()方法,在onCreate()方法中通过Bundle对象中保存的用户数据来做一些恢复数据的工作,防止Activity被系统回收时造成用户数据丢失。
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
发布了123 篇原创文章 · 获赞 119 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/cbwem/article/details/89671790