Intent和IntentFilter简介

Intent和IntentFilter是Android系统中的两个非常重要的组件,并且在我们开发Android应用程序时,也经常会涉及到这两个组件的使用。本文将对Intent和IntentFilter进行详细的介绍,并给出具体的使用方法和案例说明。

一、Intent简介

Intent是Android应用程序中使用的一种消息传递机制,用于在不同组件之间传递数据和执行动作。它可以启动应用程序中的Activity、Service或者BroadcastReceiver,并且可以在启动它们的同时传递一些数据以供使用,也可以启动其他应用程序的组件(只要这些组件是public的,且已经在清单文件中注册)。

基本语法:

```java

Intent intent = new Intent(context, target.class);

```

其中,context参数是一个上下文对象,用于指定Intent的启动上下文(一般使用当前Activity对象或者Application对象),target参数是一个Activity、Service或者BroadcastReceiver的类对象,用于指定Intent的目标组件。

Intent有两种类型:显式Intent和隐式Intent。

1.显式Intent

显式Intent是指明确指定具体目标组件的Intent,可以打开应用程序中的某一个Activity等组件。

```java

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

startActivity(intent);

```

以上代码创建了一个显式Intent,用于启动TargetActivity。其中this参数是当前Activity的上下文对象。

除了启动Activity组件之外,还可以使用Intent启动Service和BroadcastReceiver组件。

2.隐式Intent

隐式Intent是不直接指定目标组件,而是通过Intent中添加Action、Category和Data等属性来描述需要启动的组件,让Android系统自行寻找合适的组件进行启动。这种方式比较灵活,可以启动其他应用程序的Activity等组件,但需要注意的是,如果有多个组件符合Intent的描述,那么系统会弹出一个对话框,让用户进行选择。

```java

Intent intent = new Intent();

intent.setAction("com.example.action.TARGET");

startActivity(intent);

```

以上代码创建了一个隐式Intent,通过设置Action属性为“com.example.action.TARGET”,来启动符合该Action属性的组件。需要注意的是,在清单文件中定义的Activity或者其他组件也需要添加相应的Action属性和Category属性,以便让隐式Intent能够匹配到它们。

除了Action属性之外,还可以设置Category属性和Data属性,以进一步描述需要启动的组件。具体用法可以参考Android官方文档。

二、IntentFilter简介

IntentFilter是Android应用程序中用于在清单文件中注册Activity、Service或者BroadcastReceiver组件的一个标签,用于描述它们所处理的Intent的属性,以便系统能够找到合适的组件去处理收到的Intent。具体来说,IntentFilter可以设置Action、Category、Data等属性,用于在系统中查找与之匹配的Intent。

基本语法:

```xml

```

以上代码是在清单文件中注册一个TargetActivity组件,并为其添加了一个IntentFilter标签,用于设置要处理的Intent属性。具体来说,它表示TargetActivity可以处理Action属性为“com.example.action.TARGET”、Category属性为“android.intent.category.DEFAULT”,以及Data属性为“http://www.example.com”的Intent。

需要注意的是,IntentFilter并不是必须的,如果我们不设置IntentFilter标签,那么系统默认的Action属性和Category属性为“android.intent.action.MAIN”和“android.intent.category.LAUNCHER”,不需要设置Data属性。

三、Intent和IntentFilter的使用方法

在Android应用程序中,最常用的方法是使用Intent和IntentFilter配合使用来启动Activity、Service和BroadcastReceiver等组件。以下是其中一些常见的使用方法:

1.启动Activity组件

```java

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

startActivity(intent);

```

以上代码创建了一个显式Intent,用于启动TargetActivity。

```java

Intent intent = new Intent();

intent.setAction("com.example.action.TARGET");

startActivity(intent);

```

以上代码创建了一个隐式Intent,通过设置Action属性为“com.example.action.TARGET”,来启动符合该Action属性的组件。

2.启动Service组件

```java

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

startService(intent);

```

以上代码创建了一个显式Intent,用于启动TargetService。

```java

Intent intent = new Intent();

intent.setAction("com.example.action.TARGET");

startService(intent);

```

以上代码创建了一个隐式Intent,通过设置Action属性为“com.example.action.TARGET”,来启动符合该Action属性的Service组件。

3.启动BroadcastReceiver组件

```java

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

sendBroadcast(intent);

```

以上代码创建了一个显式Intent,用于启动TargetReceiver组件。

```java

Intent intent = new Intent();

intent.setAction("com.example.action.TARGET");

sendBroadcast(intent);

```

以上代码创建了一个隐式Intent,通过设置Action属性为“com.example.action.TARGET”,来启动符合该Action属性的BroadcastReceiver组件。

4.在清单文件中注册组件

```xml

```

以上代码在清单文件中注册了一个TargetActivity组件,并为其添加了一个IntentFilter标签,用于设置要处理的Intent属性。

需要注意的是,清单文件中注册的组件可以被其他应用程序访问和调用,因此在设计时需要注意安全问题。

四、Intent和IntentFilter的案例说明

1.启动系统浏览器

```java

Uri uri = Uri.parse("http://www.baidu.com");

Intent intent = new Intent(Intent.ACTION_VIEW, uri);

startActivity(intent);

```

以上代码使用Intent启动了一个系统默认浏览器,打开了指定的网页。

2.发送邮件

```java

Uri uri = Uri.parse("mailto:abc@example.com");

Intent intent = new Intent(Intent.ACTION_SENDTO, uri);

intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");

intent.putExtra(Intent.EXTRA_TEXT, "Body");

startActivity(intent);

```

以上代码使用Intent启动了一个可处理邮件发送的应用程序,填写了发送人地址、主题和正文等信息(本例中使用app自带的邮件应用程序)。

3.调用电话

```java

Uri uri = Uri.parse("tel:10086");

Intent intent = new Intent(Intent.ACTION_DIAL, uri);

startActivity(intent);

```

以上代码使用Intent启动了一个系统默认的电话应用程序,填写了电话号码,并弹出拨号页面。

4.获取联系人

```java

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);

startActivityForResult(intent, PICK_CONTACT_REQUEST);

```

以上代码使用Intent启动了一个可选择联系人的应用程序,将结果返回给当前Activity进行处理(本例中使用startActivityForResult方法,并定义了一个PICK_CONTACT_REQUEST常量用于标识请求代码)。

5.接收短信

```xml

```

以上代码在清单文件中注册了一个SMSReceiver组件,并为其添加了一个IntentFilter标签,用于设置要处理的SMS_RECEIVED广播。

```java

public class SMSReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

if (intent.getAction().equals(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)) {

Bundle bundle = intent.getExtras();

if (bundle != null) {

Object[] pdus = (Object[]) bundle.get("pdus");

for (Object pdu : pdus) {

SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);

if (sms != null) {

String messageBody = sms.getMessageBody();

String phoneNumber = sms.getOriginatingAddress();

Toast.makeText(context, "来自" + phoneNumber + "的短信:" + messageBody, Toast.LENGTH_LONG).show();

}

}

}

}

}

}

```

以上代码定义了一个SMSReceiver组件,并重写了它的onReceive方法,用于处理SMS_RECEIVED广播,并解析短信内容和发送人号码。

以上就是Intent和IntentFilter的详细介绍以及使用方法和案例说明。希望本文能够对广大Android开发者有所帮助。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.ynyuzhu.com/

点赞(74) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部