在Android开发中,Activity之间的跳转是常见的需求。例如,从短信列表的Activity跳入查看短信详情的Activity。本文将介绍关于Activity跳转的相关知识点。

首先,我们需要了解两个基本概念:Intent和Context。

1. Intent

Intent翻译为中文的意思是“意图”。它代表了要执行的操作的意图。在Android开发中,Activity的跳转、发送广播和启动Service等操作都需要用到Intent。可以将Intent理解为连接组件之间的桥梁。

例如,要跳转到一个Activity,需要配置一个Intent。这个Intent需要包含目的Activity的信息。如果需要给目的Activity传递一些数据,也需要在Intent中进行配置。配置好的Intent等待被调用。

Intent分为两类:显示Intent和隐式Intent。显示Intent可以理解为一个非常明确的意图,已经指明了具体的目标(如启动哪个具体的Activity)。隐式Intent可以理解为一个不明确的意图,不太清楚目标是谁,只能描述一个大概的样子。

显示Intent主要用于启动目标位于app内部;隐式Intent主要应用于启动的目标(如Activity)位于其他app内,其他app不会轻易把目标暴露给其他app,并且隐式Intent可以起到解耦的作用。

2. Context

Context是一个非常全能的类,它提供了很多功能,如获取各种服务、资源、启动Activity、启动Service、发送广播等。在Android开发中,Context几乎无处不在。

接下来,我们将介绍Activity跳转的相关代码。

示例代码:

```java

// 创建一个Intent对象

Intent intent = new Intent(当前Activity.this, 目标Activity.class);

// 如果需要传递数据,可以使用putExtra方法添加数据

intent.putExtra("key", "value");

// 使用startActivity方法启动目标Activity

startActivity(intent);

```

通过以上代码,我们实现了从当前Activity跳转到目标Activity的功能。

以下是根据提供的内容重构后的代码段:

```java

// 创建一个 Intent 实例,context 的类型为 Context,TargetActivity 不是真实存在的类,仅用于说明使用方法

Intent toActivityIntent = new Intent(context, TargetActivity.class);

// 调用 context 的 startActivity 方法,传入 Intent 实例进行跳转

context.startActivity(toActivityIntent);

```

上面的代码实现了跳转到 `TargetActivity`。通过这段代码,我们可以了解到 Activity 的跳转分为两步:

1. 配置一个 Intent,它包含了目标 Activity 的信息。如果需要向目标 Activity 传递数据,需要将数据放入 Intent 中。

2. 调用 context 的 `startActivity`(intent)方法。该方法接受一个 Intent 参数,用于启动目标 Activity。

根据 Intent 可以分为显示和隐式两种跳转方式,同样的,Activity 的跳转也可以分为这两种方式。

**显示跳转:**

这是最简单的跳转方式,通常用于应用程序内部的场景。下面是一个简单的例子:

```java

Intent intent = new Intent(MainActivity.this, SecondActivity.class);

startActivity(intent);

```

使用 `Context` 和 `SecondActivity.class` 构造一个 Intent,其中 `SecondActivity` 就是要跳转的目标 Activity。然后调用 `startActivity(intent)` 开始跳转到 `SecondActivity`。

**隐式跳转:**

隐式跳转是指不明确要跳转到哪个 Activity,它在应用程序之间以及大型应用程序内的 Activity 跳转中较为常见。这主要是为了实现解耦业务模块。

隐式跳转的实现步骤如下:

1. 在 AndroidManifest(清单文件)中为声明的 Activity 配置 `intent-filter`,至少需要配置 `action` 和 `category`,也可以增加其他配置项如 `data`。

2. 按照上述 `intent-filter` 的配置来构造一个 Intent。

3. 调用 `startActivity` 方法并传入上一步构造好的 Intent,进行跳转。

关于 `intent-filter` 的配置示例代码如下:

在Android中,我们可以通过Intent来启动Activity、传递数据给Activity以及隐示启动Activity。下面是关于这三方面的详细解释和示例代码:

1. 启动Activity:

```xml

```

在这个例子中,我们定义了一个名为ActionActivity的Activity,并为其配置了intent-filter。其中,action可以自定义,最好以包名开头,以保证action的唯一性;category默认为android.intent.category.DEFAULT,如果没有特殊要求可以不配置。

2. 隐示启动Activity:

```java

Intent intent = new Intent();

intent.setAction(Intent.ACTION_VIEW);

startActivity(intent);

```

通过调用Intent的setAction()方法并传入相应的action值,可以实现隐示启动Activity。但是,由于系统或其他app中可能也存在配置了相同action的Activity,这时候就需要用户自己选择了。为了解决这个问题,可以配置自己独有的action或者为intent-filter配置data属性。

3. 传递数据给Activity:

在Activity跳转的时候,我们可以通过Intent来传递数据给目标Activity。无论是显示跳转还是隐示跳转,传递参数的方式都一致。具体操作如下:

```java

// 在源Activity中创建Intent对象并设置数据

Intent intent = new Intent(SourceActivity.this, TargetActivity.class);

intent.putExtra("key", "value"); // 以key-value的形式存放数据

// 调用startActivity()方法启动目标Activity

startActivity(intent);

```

在目标Activity中,我们可以通过getIntent()方法获取到传递过来的数据:

```java

// 在目标Activity中获取传递过来的数据

Intent intent = getIntent();

String value = intent.getStringExtra("key"); // 获取key对应的value值

```

Intent intent = new Intent();

intent.setAction(Intent.ACTION_VIEW);

// 将数据存在 intent 中

intent.putExtra("KEY_TITLE", mTitle);

// 跳转 Activity

startActivity(intent);

在目标 Activity 中解析数据:

```java

@Override

protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// getIntent()获取的是 Intent 类型的实例,该实例包含了传递过来的数据等信息

if (getIntent() != null) {

// 从 intent 中拿数据,key 必须和传递的时候一样

String title = getIntent().getStringExtra("KEY_TITLE");

}

}

```

在目标 Activity 中返回数据:

有时候需要从一个 Activity(称它为启动 Activity)跳转到另外的 Activity(称它为目标 Activity),当目标 Activity 做完工作的时候需要它把处理结果返回给启动 Activity。比如微信设置头像的时候跳转到图库 app 选择图片,当用户选择好后,图库是需要把用户选择的图片返回给微信的。实现返回数据按下面步骤实现:

1. 使用 startActivityForResult() 方法跳转 Activity。

2. 在目标 Activity 调用 finish() 之前,调用 setResult() 方法设置返回数据。

3. 在启动 Activity 的 onActivityResult(int requestCode, int resultCode, Intent data) 方法中获取返回的数据。

重构后的代码如下:

A Activity中的代码:

private final int REQUEST_CODE = 2;

Intent intent = new Intent(MainActivity.this, ActionActivity.class);

startActivityForResult(intent, REQUEST_CODE);

ActionActivity中的代码:

public static final int RESULT_CODE = 200;

Intent result = new Intent();

result.putExtra("KEY_RESULT_VALUE", "ok");

setResult(RESULT_CODE, result);

finish();

MainActivity中的代码:

@Override

protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == REQUEST_CODE) {

if (resultCode == RESULT_CODE) {

String value = data.getStringExtra("KEY_RESULT_VALUE");

}

}

}

Activity跳转生命周期的变化:

当A Activity跳转到B Activity时,这两个Activity的生命周期会发生以下变化:首先是A的onPause方法被调用。

在Android系统中,当两个Activity之间进行跳转时,它们的生命周期方法会被按照一定的顺序执行。在这个过程中,一个Activity的onCreate、onStart和onResume方法会在另一个Activity的相应方法之前被执行,而onPause、onStop和onDestroy方法则会在另一个Activity的相应方法之后被执行。这种生命周期方法的执行顺序对于Activity之间的交互非常重要。

例如,当从AActivity启动BActivity时,以下步骤会按照顺序执行:

1. BActivity的onCreate方法被执行;

2. BActivity的onStart方法被执行;

3. BActivity的onResume方法被执行;

4. AActivity的onPause方法被执行(如果当前Activity是可见的);

5. AActivity的onStop方法被执行(如果当前Activity是可见的)。

需要注意的是,这两个步骤中的任何一个回调方法里面如果有耗时操作,都会影响后面的流程。例如,在AActivity的onPause方法中进行耗时操作,就会影响到BActivity的启动过程。同样地,在BActivity中执行耗时操作,也会互相影响,最终影响到AActivity的onStop方法。

为了解决这类问题,我们可以采取以下措施:

1. 尽量避免在生命周期方法中进行耗时操作,以免影响其他Activity的启动和销毁;

2. 如果必须要在生命周期方法中进行耗时操作,可以考虑使用异步任务(如AsyncTask)或者HandlerThread等技术来避免阻塞UI线程;

3. 在需要返回数据给启动Activity的地方,可以使用Intent传递数据;

4. 在目标Activity返回数据给启动Activity时,可以在启动Activity中重写onNewIntent方法来接收数据。

通过以上方法,我们可以确保两个Activity之间的生命周期方法按照预期的顺序执行,从而实现良好的交互效果。