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/
发表评论 取消回复