目录

概述:

在Android开发中,页面之间的跳转是一个常见的需求,例如打开其他应用、启动活动等。本文将介绍Intent这一重要方式在Android程序中的应用。

1. Intent的显示启动

Intent可以指定当前组件想要执行的操作以及在不同组件之间传递数据。要显示启动一个活动,需要创建一个Intent对象,并设置其上下文为当前活动的上下文,目标活动为目标活动的类名。然后调用startActivity()方法即可。

示例代码:

```java

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

startActivity(intent);

```

通过这种构造函数,我们可以构建出明确目标的Intent“意图”,从而实现显示启动。

2. 隐式Intent启动

与显式Intent启动类似,我们还可以使用隐式Intent来启动其他应用程序的活动。只需要创建一个Intent对象,并设置相应的操作和类别,然后调用startActivity()方法即可。

示例代码:

```java

Intent intent = new Intent("com.zqunyan.zgstudy.ACTION_START");

intent.addCategory("com.zqunyan.zgstudy.MY_CATEGORY");

startActivity(intent);

```

或者:

```java

Intent intent = new Intent("com.zqunyan.zgstudy.ACTION_START");

startActivity(intent);

```

这里使用的是category android.intent.category.DEFAULT作为类别。

3. 启动其他程序

除了启动自己程序内的活动,我们还可以使用隐式Intent来启动其他程序的活动。只需创建一个Intent对象,并设置相应的操作,然后调用startActivity()方法即可。

示例代码:

```java

Intent intent = new Intent("com.zqunyan.zgstudy.ACTION_START");

startActivity(intent);

```

4. 网页浏览

要实现网页浏览功能,我们需要创建一个Intent对象,并设置相应的操作为android.intent.action.VIEW,然后将网页地址转换成Uri对象传递进去。最后调用startActivity()方法即可。

示例代码:

```java

Intent intent = new Intent(Intent.ACTION_VIEW);

intent.setData(Uri.parse("https://www.baidu.com"));

startActivity(intent);

```

5. 拨号界面

有时候我们需要打开手机拨号界面进行拨打电话的操作。这时可以使用Intent对象,并设置相应的操作为android.intent.action.DIAL,然后将电话号码转换成Uri对象传递进去。最后调用startActivity()方法即可。

示例代码:

```java

Intent intent = new Intent(Intent.ACTION_DIAL);

intent.setData(Uri.parse("tel:10086"));

startActivity(intent);

```

根据包名打开软件:首先,我们需要使用`PackageManager`来根据包名获取应用的启动页面。以下是一个示例代码:

```java

Intent intent = getPackageManager().getLaunchIntentForPackage("com.zqunyan.zgwidget");

if (intent != null) {

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

}

```

根据类名打开界面:

这种方法通常用于打开系统设置界面或其他快捷功能设置。我们可以使用`ComponentName`来实现这个功能。下面是一个实例,用于打开华为手机的设置页面:

```java

Intent intent = new Intent();

ComponentName componentName = new ComponentName("com.android.settings", "com.android.settings.Settings$DisplaySettingsActivity");

intent.setComponent(componentName);

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(intent);

```

使用`startActivityForResult`:

当我们点击跳转按钮时,可以创建一个带有返回结果的`Intent`,并使用`startActivityForResult`方法启动另一个活动。第二个参数`requestCode`用于处理返回结果,以判断是哪个语句调用的跳转。以下是一个示例代码:

```java

Intent intent = new Intent(MainActivity.this, ReturnValueActivity.class); // 第二个参数用于处理返回结果

startActivityForResult(intent, 1); // requestCode = 1

```

处理返回结果:

在`ReturnValueActivity`中,我们需要重写`onActivityResult`方法来接收从上一个活动中返回的结果。以下是一个示例代码:

```java

@Override

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

super.onActivityResult(requestCode, resultCode, data);

if (requestCode == 1 && resultCode == RESULT_OK) {

// 处理返回结果

}

}

```

重构后的内容如下:

```java

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {

super.onActivityResult(requestCode, resultCode, intent);

if (requestCode == 1) {

if (resultCode == 1) {

String content = intent.getStringExtra("content");

lblStatus.setText("success");

} else {

lblStatus.setText("fail");

}

}

}

```

跳转界面并传递返回值及关闭自身:

```java

// 实例化一个空的 Intent 绑定数据到 Intent

Intent intent = new Intent();

intent.putExtra("content", txtMessage.getText().toString());

// setResult第一个参数为结果码,常用的有Activity.RESULT_OK、RESULT_CANCELED或者自定义整数型结果码 // 第二个参数为返回值,返回值封装在Intent中

setResult(1, intent);

// 关闭自身,主画面接收返回结果

finish();

```

页面传值:

```java

// Intent.putExtra 传值

intent.putExtra("uname", "admin");

// 取值

Intent intent = getIntent();

String name = intent.getStringExtra("uname");

```

借助 Bundle 传值:

```java

// 用于在 Activity 之间传送值或数组资料,好处是当一个页面跳转多个页面时,可以共用bundle。

Bundle bundle = new Bundle();

bundle.putString("uname", "admin");

startActivity(new Intent(this, SecondActivity.class).putExtras(bundle));

```

在 Android 开发中,我们可以通过 Bundle 对象来传递数据。Bundle 类似于一个字典,可以将键值对存储在其中。以下是如何使用 Bundle 进行传值和取值的示例:

首先创建一个 Bundle 对象并添加一些键值对:

```java

Bundle bundle = new Bundle();

bundle.putString("NAME", "QY");

bundle.putInt("AGE", 18);

bundle.putDouble("TALL", 175.86);

ArrayList lstFilePaths = new ArrayList<>();

lstFilePaths.add("path1");

lstFilePaths.add("path2");

bundle.putStringArrayList("lstFilePaths", lstFilePaths);

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

intent.putExtras(bundle);

startActivity(intent);

```

接下来,在目标活动(TargetActivity)中接收这些值:

```java

Intent intent = getIntent();

Bundle bundle = intent.getExtras();

String strName = bundle.getString("NAME");

int intAge = bundle.getInt("AGE");

ArrayList lstFilePaths = bundle.getStringArrayList("lstFilePaths");

```

如果想要传递自定义的数据类,需要让该类实现 Serializable 接口。例如:

```java

public class GoodsInfoModule implements Serializable {}

```

然后将 GoodsInfoModule 对象序列化并传入 Bundle:

```java

GoodsInfoModule goodsInfo = new GoodsInfoModule();

bundle.putSerializable("goodsInfo", goodsInfo);

```

最后,在目标活动(TargetActivity)中获取 GoodsInfoModule 对象:

```java

GoodsInfoModule goodsInfo = (GoodsInfoModule) bundle.getSerializable("goodsInfo");

```