Activity和Intent的使用

一、Context

1、在开发Android应用过程中,经常会遇到调用方法时会第一个参数是Context类型。

2、Context 的中文翻译为:语境; 上下文; 背景; 环境,在开发中我们经常说称之为“上下文”。

3、在Android中,Context表示一种场景,代表与操作系统交互的过程。在Android开发中,启动Activity、获取系统服务、加载资源、View操作等往往都会传递一个Context参数。

4、在具体的代码实现上,Context是Android中的一个抽象类,包括Activity、Service、Application 等都是该类的一个实现。

一、Activity的使用

1、Acitivity的作用

① Activity是Android项目中的一个应用组件,用户可与其提供的屏幕进行交互,通俗的说Activity就是一个界面,每个 Activity 都会获得一个用于绘制其用户界面的窗口,窗口通常会充满屏幕。

② 一个应用由多个由有关联关系的 Activity 组成,彼此之间完成特定的业务逻辑。

③ 由前文所述已知,一个应用中会指定一个Activity为”主“Activity,首次启动应用时呈现给用户的那个 Activity,通常称之为入口Activity。该Activity会在AndroidManifest.xml文件中特殊指定。

2、Activity的管理

① 每个 Activity 均可启动另一个 新的Activity,完成特定的业务逻辑。

② Activity从被创建,到被用户可视化看到,再到被系统销毁,会经历一系列的周期函数的调用和状态的变化,因此Activity是有声明周期的。

③ Android系统使用堆栈(返回栈)来存储和管理Activity。遵循基本的”先进后出“的堆栈机制。

④ Activity的声明周期函数包含:onCreate、onStart、onReStart、onResume、onPause、onStop、onDestory七个函数。

3、Activity的创建

① Activity本身是Android的SDK的一个类。

② 如果要自定义一个自己的活动窗口,需要继承自Activity,即创建的自定义Activity必须是系统Activity的子类。

③ 调用setContentView来实现布局文件的设置。

④ 在AndroidManifest.xml文件中进行Activity的声明。

4、启动Activity

Intent intent = new Intent();
intent.setClass(this, ActivityName.class);
startActivity(intent);

可以通过上述最简单的方式启动一个Activity。

5、Activity之间的数据传递

① startActivity启动时携带数据,在新窗口中进行接收。

② startActivityForResult:调用Activity执行结束后,返回调用数据和结果。

二、Intent和Intent过滤器

1、Intent

在Android中,Intent是一个消息传递对象,Intent主要的作用就是实现各个组件的联络和通信功能。比如说:启动一个新的窗口界面,在Activity之间进行数据的传递等。

2、Intent的分类

Intent分为两类:显示Intent和隐式Intent。

  • 显示Intent:通过指定具体的名称或者组件名称给Intent,进行程序执行和处理。比如,启动一个具体的Activity,属于显示Intent。
  • 隐式Intent:没有具体的名字和组件,仅声明要执行哪些操作。

3、IntentFilter过滤器

在使用隐士Intent时,由于没有具体的名字和组件,因此必须由Android系统帮助定位和确定与Intent任务相匹配的组件。Android将Intent的请求内容和一个叫做IntentFilter的过滤器比较,IntentFilter中包含系统中所有可能的待选组件。

  • 在Android开发中,需要在AndroidManifest.xml中声明自己所包含组件的过滤器,用以来表明组件可以匹配哪些Intent请求。
  • 一个没有声明Intent-Filter的组件只能响应指明自己名字的显式Intent请求,而无法响应隐式Intent请求。

Android系统在使用IntentFilter来解析隐式Intent请求时,主要使用三个维度的标准进行筛选和过滤:

  • Action:系统中已经定义了一系列常用的动作,内容为文本字符串。可以在类中,通过setAction()方法或在清单文件AndroidManifest.xml中设置。
  • Data:Data通常是URI格式定义的操作数据。例如:tel:// 。在Java类中,可以通过setData()方法设置。
  • Category:Category属性用于指定当前动作(Action)被执行的环境。在class中可以通过addCategory方法或在清单文件AndroidManifest.xml中设置。默认为:CATEGORY_DEFAULT。
  • Extras:Extras属性主要用于传递目标组件所需要的额外的数据。在class类中通过putExtras()方法设置。

4、常见的ACTION、CATEGORY、DATA等

  • ACTION:
    ACTION_MAIN:Android Application的入口,每个Android应用必须且只能包含 一个此类型的Action声明。  ACTION_VIEW:系统根据不同的Data类型,通过已注册的对应Application显 示数据。 ACTION_EDIT:系统根据不同的Data类型,通过已注册的对应Application编辑示数据。  ACTION_DIAL:打开系统默认的拨号程序,如果Data中设置了电话号码,则自动在拨号程序中输入此号码。  ACTION_CALL:直接呼叫Data中所带的号码。  ACTION_ANSWER:接听来电。 
  • CATEGORY:
    CATEGORY_DEFAULT:Android系统中默认的执行方式,按照普通Activity的执行方式执行。  CATEGORY_HOME:设置该组件为Home Activity。 CATEGORY_PREFERENCE:设置该组件为Preference。  CATEGORY_LAUNCHER:设置该组件为在当前应用程序启动器中优先级最高的Activity,通常为入口ACTION_MAIN配合使用。 
  • Data:
    tel://:号码数据格式,后跟电话号码。  mailto://:邮件数据格式,后跟邮件收件人地址。 smsto://:短息数据格式,后跟短信接收号码。 content://:内容数据格式,后跟需要读取的内容。  file://:文件数据格式,后跟文件路径。

三、Activity的启动模式

前文已介绍过,一个应用程序通常是由多个Activity组成的,而任务栈(Task Stack)则是用来存放和管理当前应用中一个或多个Activity的栈结构,利用栈结构“先进后出”的特点,它可以记录这些Activity启动的先后顺序。

3.1、Android的四种启动模式

1、standard标准模式

标准模式,这也是系统默认的模式,每次启动Activity都会重新创建一个新的实例,不管这个实例是否已经存在,这是一种典型的多例实现。

应用场景:适用于app里面的大部分普通页面,打开一个新的页面,就创建一个Activity,由于标准启动模式的是最普通的模式,所以在使用场景这块,主要是看页面交互需求里,哪些不适合标准启动模式,我们要用新的启动模式替换标准启动模式。

2、singleTop栈顶模式

当试图一个Activity启动时,如果发现任务栈的栈顶已经存在该Activity,那么Activity实例不会被重新创建,而是直接复用栈顶的Activity实例。但是当要创建的活动不是在栈顶时,即使栈中已有该活动的实例,仍然会创建新的实例。

应用场景:适用于一些文章类的内容呈现页面,为了解决用户页面交互可能需要多次按返回键回到主页的场景(这种场景的发生,往往和系统通知栏打开页面有关,当然还有可能是特定的交互设计,希望快速回到任务栈中的特定页面),我们使用singleTop模式。再比如支付业务的结果页面,为了避免多次回调出现多个支付回调页面,可以设计Activity的启动模式为singleTop。

3、singleTask栈内复用模式

singleTask模式,在这种模式下,每次启动Activity时,先检查任务栈中是否已经存在该Activity的实例,如果已存在,则复用该实例,并且弹出任务栈中该实例前面的所有Activity(即销毁它上面的其它Activity),使其自身位于栈顶。

应用场景:如果在应用的整个存活生命周期中,希望当前页面交互的Activity只有一个,我们可以选择使用singleTask启动模式,也就是说:如果希望当前Activity在当前应用内唯一,使用singleTask模式。比如,应用的主界面一般可以设计成singleTask模式,一般主页面的设计都是一个Activity加三四个tab页。又比如注册在应用的主界面,进入登录界面,可以执行注册流程,注册完成后重新回到登录界面进行登录,适合使用singleTask。

4、singleInstance单实例模式

singleInstance模式,这是一种单例模式,整个手机操作系统里面只有一个Activity实例存在,该Activity会运行在自己的任务栈里面,并且该Activity 始终是这个任务栈里唯一的成员。

应用场景:希望整个android手机系统全局唯一页面,可以使用此种模式,不是特别常见,会见于系统应用中。

3.2、启用Activity的启动模式

在AndroidManifest.xml文件中,Activity的标签声明时,可以使用launchMode属性启用Activity的启动模式。