Activity与Fragment

Android四大基本组件

  • Activity
  • Service
  • BroadcastReceiver
  • ContentProvider

Activity

子类PreferenceActivity

PreferenceActivity是一个非常有用的基类,当开发Android引用时,不可避免地需要进行选项设置,这些选项设置会以参数的形式保存,习惯上会用Preferences进行保存。
一旦Activity继承了PreferenceActivity,那么该Activit完全不需要进行自己控制Preferences的读写,PreferenceActivity会为我们处理一切。PreferenceActivity使用选项设置的布局文件。
建议将PreferenceActivity和PreferenceFragment结合使用,其中PreferenceActivity只负责加载选项设置列表的布局文件,PreferenceFragment负责加载选项设置的布局文件。

配置Activity

  • 为application标签添加activity子元素即可

启动、关闭Activity

一个APP通常会包含多个Activity,但只有一个Activity会作为程序的入口。其他Activity,由入口Activity启动后,再适时地启动。

启动Activity

  • startActivity(Intent intent)方法: 启动其他Activity
  • startActivityForResult(Intent intent, int requestCode)方法
    requestCode由程序员根据业务自行指定。以指定的requestCode启动Activity

关闭Activity

  • finish(): 结束当前Activity
  • finishActivity(int requestCode): 结束startActivityForResult(Intent intent, int requestCode)方法启动的Activity

使用Bundle在Activity之间交换数据

在Activity之间交换数据使用信使Intent,而Intent主要通过Bundle来携带数据。

Activity的回调机制

Web应用中的Servlet,服务器何时创建Servlet的实例,何时回调Servlet的方法向用户生成响应,程序员无法控制,这种回调有服务器自行决定。Android中的Activity有点类似于Servlet。Activity被开发出来后,需要在AndroidManifest.xml文件配置该Activity。至于该Activity何时被实例化,它的方法何时被调用,对开发者来说是完全透明的。当Activity被部署在Android应用中之后,随着应用程序的运行,Activity会不断地在不同的状态之间切换,该 Activity中特定的方法就会被回调——开发者就可以选择性地重写这些方法来加入业务相关处理。

Activity的生命周期与加载模式

Activity的四个状态

  • 活动状态:Activity位于前台,用户可见,可以获得焦点
  • 暂停状态:Activity位于前台,用户可见,只是不能获得焦点
  • 停止状态:Activity不可见,失去焦点
  • 销毁状态:Activity结束,或者Activity所在的Dalvik进程被结束

Activity回调的方法

  • onCreate(Bundle savedStatus): 创建时调用,只会被调用一次
  • onStart(): 启动Activity时被调用
  • onRestart(): 重新启动Activity时被调用
  • onResume():恢复Activity时被回调,onStart方法后一定会回调该方法
  • onPause(): 暂停Activity时被回调
  • onStop(): 停止Activity时被回调
  • onDestory(): 销毁Activity时被回调。该方法只会被回调一次。
    Activity与Fragment

Activity与Servlet的相似性与区别

相似

  • 职责都是想用户呈现界面
  • 都继承系统的基类
  • 开发出来后,都需要配置
  • 开发者无需创建他们的实例,无须调用他们的方法。都有系统回调。
  • 各自的生命周期都由外部负责管理
  • 都不会直接相互调用,因此都不能直接进行交换数据
    Servlet借助requestScope、sessionScope等;Activity借助于Bundle。

区别

  • Activity以窗口的形式显示出来,Servlet不生成应用界面,知识向浏览器生成文本响应
  • Activity本质是通过各种界面组件来搭建界面;Servlet主要以IO流向浏览器生成文本响应,浏览器解析并生成界面
  • Activity之间的跳转主要通过Intent对象来控制,Servlet之间跳转主要用用户请求来控制

Activity的四种加载模式

  • standard:默认模式
  • singleTop:Task顶单例模式
  • singleTask:Task内单例模式
  • singleInstance:全局单例模式

Fragment详解

Fragment设计的初衷是为了适应大屏幕的平板电脑。Fragment对UI组件进行分组、模块化管理,可以更方便地在运行过程中动态更新Activity的用户界面。
Fragment代表了Activity的子模块,可以把Fragment理解成Activity的片段。Fragment有自己的生命周期,也可以接受他自己的输入时间。
Fragment必须被“嵌入”Activity中使用,虽然Fragment有自己的生命周期,但受到Activity的生命周期的控制;

特征

  • Fragment总是作为Activity界面的组成部分。Fragment可调用getActivity方法获取它所在的Activity,Activity可调用FragmentManagerde findFragmentById或findFragmentByTag来获取Fragment。
  • 在Activity运行过程中,可调用FragmentManager的add(), remove(), replace(),方法动态地添加、删除、替换Fragment。
  • 一个Activity可以同时组合多个Fragment;反过来,一个Fragment也可被多个Activity复用。
  • Fragment可以响应自己的输入事件,并拥有自己的声明周期,但它们的生命周期收其所属Activity的生命周期限制。

创建

继承Fragment基类,实现onCreate(), onCreateView(), onPause()

  • onCreate()
    系统创建Fragment对象后回调该方法,实现代码中只初始化想要再Fragment中保持的必要组件,当Fragment被暂停或者停止后可以恢复;
  • onCreateView()
    当Fragment回执界面组件时会回调该方法。该方法必须返回一个View,该View也就是该Fragment所显示的View。
  • onPause()
    当用户离开该Fragment时将会回调该方法。

将Fragment添加到Activity的两种方式


  • 在布局文件中使用fragment元素添加Fragment,将android:name属性指定Fragment的实现类;
  • 在Java代码中通过Fragmenttransaction对象的add()方法来添加Fragment

Activity的getFragmentManager()方法可返回FragmentManager,FragmentManager对象的beginTransaction()方法即可开启并返回FragmentTransaction对象。

Fragment管理与FragmentManager事务

Activity管理Fragment主要依靠FragmentManager。FragmentManager使用如下方法:

  • 使用findFragmentById或findFragmentByTag()方法来获取指定Fragment;
  • 调用popBackStack()方法将Fragment从后台栈中弹出;
  • 调用addOnBackStackChangeListener()注册一个监听器,用于监听后台栈的变化;

如果需要添加、删除、替换Fragment,则需要借助于FragmentTransaction对象,FragmentTransaction代表Activity对Fragment执行的多个改变。

Fragment的生命周期

  • 活动状态:Fragment位于前台,用户可见,可以获得焦点
  • 暂停状态:Fragment位于前台,用户可见,只是不能获得焦点
  • 停止状态:Fragment不可见,失去焦点
  • 销毁状态:Fragment被完全删除,或者Fragment所在的Activity被结束
    官网文档只提到了三个状态,没有提到“销毁状态”。因为处于“销毁状态”的Fragment基本不用了,只能等着被回收了。

回调方法

  • onAttach()
    当该Fragment被添加到Activity时被回调,只会被调用一次;
  • onCreate(Bundle savedStatus)
    创建Fragment时被回调,只会被调用一次;
  • onCreateView()
    每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View组件;
  • onActivityCreated()
    当Fragment所在的Activity被启动完成后回调该方法;
  • onStatus()
    启动Fragment时被回调;
  • onResume()
    恢复Fragment时被回调,onStart方法后一定会回调该方法;
  • onPause()
    暂停Fragment时被回调;
  • onStop()
    停止Fragment时被回调;
  • onDestoryView()
    销毁该Fragment所包含的View组件时调用;
  • onDestory()
    销毁Fragment时被回调。该方法只会被调用一次;
  • onDetach()
    将该Fragment从Activity中被删除、被替换完成时回调该方法,onDestory方法后一定会回调onDetach方法。该方法只会被调用一次;
    Activity与Fragment