目录
概述:
在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.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
```
如果想要传递自定义的数据类,需要让该类实现 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");
```