安卓的Activity是Android应用开发中的一个重要组件,它代表了用户界面的一个单独屏幕或窗口。每个Activity都拥有一个用户界面,并且可以与用户交互,例如响应用户的输入、展示信息等。一个应用通常由多个Activity组成,它们通过相互之间的跳转和交互来完成应用的功能。
Activity 的启动和结束
从当前页面跳到新页面,跳转代码如下:
startActivity(new Intent(源页面.this, 目标页面.class));
从当前页面回到上一个页面,相当于关闭当前页面,返回代码如下:
finish(); // 结束当前的活动页面
Activity 的生命周期
onCreate:创建活动。把页面布局加载进内存,进入了初始状态。
onStart:开始活动。把活动页面显示在屏幕上,进入了就绪状态。
onResume:恢复活动。活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击动作、允许用户输入文字等等。
onPause:暂停活动。页面进入暂停状态,无法与用户正常交互。
onStop:停止活动。页面将不在屏幕上显示。
onDestroy:销毁活动。回收活动占用的系统资源,把页面从内存中清除。
onRestart:重启活动。重新加载内存中的页面数据。
onNewIntent:重用已有的活动实例。
把以下代码加入你的Activity类,
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("onCreate"}
@Override
protected void onStart(){
super.onStart();
System.out.println("onStart");
}
@Override
protected void onResume(){
super.onResume();
System.out.println("onResume");
}
@Override
protected void onPause(){
super();
System.out.println("Pause");
}
@Override
protected void onStop {
super.onStop();
System.out.println("onStop");
}
@Override
protected void onDestroy(){
super.onDestroy();
System.out.println("onDestroy"}
@Override
protected void onRestart(){
super.onRestart();
System.out.println("onRestart");
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
System.out.println("onNewIntent");
}
}
各状态之间的切换过程
打开新页面的方法调用顺序为:
onCreate→onStart→onResume
关闭旧页面的方法调用顺序为:
onPause→onStop→onDestroy
显式Intent和隐式Intent
Intent是各个组件之间信息沟通的桥梁,它用于Android各组件之间的通信,主要完成下列工作:
- 标明本次通信请求从哪里来、到哪里去、要怎么走。
- 发起方携带本次通信需要的数据内容,接收方从收到的意图中解析数据。
- 发起方若想判断接收方的处理结果,意图就要负责让接收方传回应答的数据内容。
显式Intent
显式Intent,直接指定来源活动与目标活动,属于精确匹配。它有三种构建方式:
在Intent的构造函数中指定。
调用意图对象的setClass方法指定。
调用意图对象的setComponent方法指定。
//下面是三种构建显式Intent的示例代码:
//1. 在Intent的构造函数中指定:
Intent intent = new Intent(MainActivity.this, TargetActivity.class);
startActivity(intent);
//2. 调用意图对象的setClass方法指定:
Intent intent = new Intent();
intent.setClass(MainActivity.this, TargetActivity.class);
startActivity(intent);
//3. 调用图对象的setComponent方法指定:
Intent intent = new Intent();
intent.setComponent(new ComponentName(MainActivity.this,"com.example.app.TargetActivity"));
startActivity(intent);
其中,MainActivity.this是指当前活动的上下,TargetActivity是指跳转目标的活动类名,"com.example.app.TargetActivity"是跳转目标的完整名路径和类名。
代码示例适用于在当前活动中启动其他目标活动。显式Intent,我们可以确指定来源活动与目标活动。
隐式Intent
隐式Intent,没有明确指定要跳转的目标活动,只给出一个动作字符串让系统自动匹配,
向下一个Activity发送数据
Intent使用Bundle对象存放待传递的数据信息。
Bundle对象操作各类型数据的读写方法说明见下表。
Bundle
在代码中发送消息包裹,调用意图对象的putExtras方法,即可存入消息包裹。
在代码中接收消息包裹,调用意图对象的getExtras方法,即可取出消息包裹。
// 在当前Activity中创建一个Intent对象
Intent intent = new Intent(CurrentActivity.this, NewActivity.class);
创建一个Bundle对象,并存需要传递的数据
Bundle bundle = new Bundle();
bundle.putString("key", "value"); // 在bundle中存入,使用键值对的形式
// 将Bundle对象入Intent中
intentExtras(bundle);
// 启动目标Activity
startActivity(intent```
接收消息包裹代码:
```java
// 在目标Activity中传递的Intent对象
Intent intent = getIntent();
// 通过getExtras()方法获取传递的Bundle对象
Bundle bundle intent.getExtras();
// 判断Bundle是否为空
if (bundle != null) {
// 取出数据
String value = bundle.getString("key");
// 处理数据
}
向上一个Activity返回数据
处理下一个页面的应答数据,详细步骤说明如下:
上一个页面打包好请求数据,调用startActivityForResult方法执行跳转动作
下一个页面接收并解析请求数据,进行相应处理
下一个页面在返回上一个页面时,打包应答数据并调用setResult方法返回数据包裹
上一个页面重写方法onActivityResult,解析获得下一个页面的返回数据
以下是示例代码:
**在上一个页面中发送请求数据并接收下一个页面返回的数据:**
```java
// 在上一个页面中发送请求数据并接收返回数据
private static final int REQUEST_CODE = 1; // 自定义请求码
// 在上一个页面中启动下一个页面
Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
startActivityForResult(intent, REQUEST_CODE);
// 重写onActivityResult方法,接收返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_CODE) {
if (resultCode == RESULT_OK) {
// 获取返回的数据包裹
Bundle bundle = data.getExtras();
if (bundle != null) {
// 解析数据
String result = bundle.getString("key");
// 处理数据
}
} else (resultCode == RESULT_CANCELED) {
// 用户取消了操作
}
}
}
```
**在下一个页面收上一个页面发送的请求数据并返回应答数据:**
```java
// 在下一个页面中接收上一个页面发送的请求数据
Intent intent = getIntent();
if ( != null) {
//请求数据
Bundle requestBundle = intent.getExtras();
if (requestBundle != null) {
// 解析数据
String requestData = requestBundle.getString("key");
// 处理请求数据
}
}
// 创建一个Bundle对象,存入返回的应数据
Bundle responseBundle = new Bundle();
responseBundle.putString("key", "value"); // 存入应答数据
// 在下一个页面中设置返回的应答数据包裹
Intent responseIntent = new Intent();
responseIntent.putExtras(responseBundle);
// 在下一个页面中返回数据给上一个页面
setResult(RESULT_OK, responseIntent);
finish();
```
在上一个页面中,我们首先定义了一个请求码REQUEST_CODE,用于标识此次请求。然后使用startActivityForResult()方法启动下一个页面,并将请求码REQUEST_CODE作为参数传入。
在下一个页面中,我们首先通过getIntent()获取上一个页面传递的请求数据,并进行解析和处理。然后创建一个Bundle对象,将应答数据存入其中。之后,我们通过setResult()方法将应答数据和结果码RESULT_OK设置给Intent,然后调用()方法结束当前页面,并将数据返回给上一个页面。
最后,在上一个页面中重写onActivityResult()方法,判断请求码和结果码,若一致则取出应答数据进行处理。