Intent与IntentFilter

2023-10-30 17:45
文章标签 intent intentfilter

本文主要是介绍Intent与IntentFilter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Android程序中,一般应用程序是由多个核心组件构成的。如果用户用户需要从一个Intent切换到另一个Activity,则必须使用Intent。实际上,Activity,Service和BroadcastReceiver这3种核心组件都需要使用Intent进行操作,Intent用于相同或者不同的应用程序组件间的绑定

一、Intent与IntentFilter

Intent为意图,是程序各组件间进行交互的一种重要方式,它不仅可以指定当前组件要求执行的动作,还可以在不同组件之间进行数据传递,一般用于启动Activity和Service和发送广播等。根据开启目标组件方式的不同,Intent分为两种类型,分别是显式Intent隐式Intent

(一)显式Intent

显式Intent指直接指定目标组件。

Intent intent=new Intent(MainActivity.this,MainActivity2.class);
startActivity(intent);
//上述代码中,创建的Intent对象中传入了2个参数,其中第1个参数表示当前Activity,第2个参数表示要跳转到的目标ActivityIntent intent=new Intent();
intent.setClass(MainActivity.this,MainActivity2.class);
startActivity(intent);

(二)隐式Intent(IntentFilter)

1.匹配规则

(1)action规则:

IntentFilter中可有1~N个action属性;必有一个

Intent中有1个action属性,且Intent中action需与IntentFilter中任意一个匹配

IntentFilterAction(1~N个) >= IntentAction(1个)

(2)data规则

data由TypeURL两部分组成,全相同才匹配。

IntentFilter中可有0~N个data属性;可没有

Intent中有0~1个data属性,如IntentFilter有data则Intent中必有,且Intent中data需与IntentFilter中任意一个匹配

IntentFilterData(0~N个) >= IntentData(0~1个) 且IntentFilter有data则Intent中必有

(3)category规则

IntentFilter中可有1~N个category属性;必有一个"android.intent.category.DEFAULT"

Intent中有0~N个category属性,默认的category无需添加(自带),且Intent中category需全为IntentFilter中有的

IntentFilterCategory(1~N个) >= IntentCategory(0~N个)

2.隐式启动

如果想使外部程序隐式启动该Activity需将exported属性设为true

<activityandroid:name=".MainActivity"android:exported="true"></activity>

3.Intent中添加属性

(1)添加action,data,category属性
Intent intent=new Intent();
//活动
intent.setAction(" ~ ");
//数据及类型
intent.setDataAndType( url , "type" );
//分类;默认category无需添加
intent.addCategory(" ~ ");//跳转
startActivity( intent );
(2)获取Intent中data属性的信息
Intent intent=getIntent();
URL url=intent.getData();

4.IntentFilter中添加属性

(1)Activity中的IntentFilter
<activityandroid:name=".MainActivity"android:exported="true">
<!-- 设置android:exported="true"使其他程序可以隐式启动该Activity !--><intent-filter><action android:name="android.intent.action.MAIN" /><data android:mimeType=" " android:scheme=" "/><category android:name="android.intent.category.DEFAULT" />
<!-- 必需添加默认的category属性"android.intent.category.LAUNCHER" !--></intent-filter>
</activity>
(2)Java代码中创建IntentFilter

 

//在使用广播等组件时也会使用到IntentFilter(意图过滤器)
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(" ~ ");
intentFilter.addCategory(" ~ ");

二、Activity之间的数据传递

1.使用Intent的 putExtra() (额外的)方法传递数据

由于Activity之间需要传递不同类型的数据,所以Android提供了多个重载的putExtra()方法,重载的 putExtra(String name,value)方法都包含2个参数,参数name表示传递的数据名称,参数value表示传递的数据信息
通过putExtra()方法传递的数据存储在Intent对象后,如果想获取该数据,可以通过getXXXExtral()方法来实现。

Intent intent=new Intent(MainActivity.this,MainActivity2.class);
intent.putExtra("studentName","王可");
intent.putExtra("englishScore",98);
intent.putExtra("isPassed",true);
startActivity(intent);//获取Intent
Intent intent=getIntent();
//获取字符串,无值则返回Null
String student_name=intent.getStringExtra("studentName");
//获取int boolean,无值则返回默认值(第二个参数)
int english_score=intent.getIntExtra("englishScore",0);
boolean is_passed=intent.getBooleanExtra("isPassed",false);

2.使用Bundle (捆)传递数据

Bundle类与Map接口类似,都是通过键值对的形式保存数据
首先使用Bundle对象存储数据.put…("name",value),然后调用putExtras()将Bundle对象封装进Intent对象中。可通过getExtras()获取Intent中的Bundle对象;使用getXXX()获取Bundle对象中的键值。

Intent intent=new Intent(MainActivity.this,MainActivity2.class);
//创建Bundle对象
Bundle bundle=new Bundle();
bundle.putString("studentName","王可");
bundle.putInt("englishScore",98);
bundle.putBoolean("isPassed",true);
//向Intent中添加Bundle对象
intent.putExtras(bundle);
startActivity(intent);//获取Intent
Intent intent=getIntent();
//获取Bundle对象
Bundle bundle=intent.getExtras();
String student_name=bundle.getString("studentName");
int english_score=bundle.getInt("englishScore",0);
boolean is_passed=bundle.getBoolean("isPassed",false);

三、Activity之间的数据回传

当从MainActivity界面跳转到SeandActirity界面时,需要在SecondActivity界面上进行一些
操作,当关闭SecondActivity界面时,需要从该界面返回一些数据到MainActivity界面。

1.startAcivityForResult()方法

用于开启一个Activity,当开启的Activity被销毁时,会从销毁的Activity中返回数据
startActivity For Result(Intent intent,int requestcode)
intent  表示意图对象。
requestCode  表示请求码,用于标识请求的来源。如有2个按钮可转到Accivity2,可根据清求码区分是由哪个按钮跳转的。

2.setResult()方法

用于携带数据回传。
setResult(int resultCode,Intent intent)
resultcode  表示返回码,用于标识返回的数据 来自于哪个Activity。
intent  用于携带数据。

3.重写 onActivityResult()方法

用于接收回传的数据
protected void on ActivityResult( int requestCode,int resultCode,Intent data)
resquestcode  表示请求码
resultCode  表示回传码
data  表示回传的数据

4.实例

//Activity1中
Intent intent=new Intent(Activity1.this,Activity2.class);
startActivityForResult(intent,1);//Activity2中
Intent intent_data=new Intent();
intent.putExtra("data","hello");
//设置回传数据
setResult(2,intent_data);
//销毁Activity2(销毁后才会回传数据)
finish();//Activity1中重写---接收回传数据
protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);//判断请求码和回传码if (requestCode == 1 && resultCode == 2) {String str = data.getStringExtra("data");... ...}
}

这篇关于Intent与IntentFilter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/309578

相关文章

兔子--PendingIntent与Intent的区别

pendingIntent是一种特殊的Intent。 主要的区别在于Intent的执行立刻的,而pendingIntent的执行不是立刻的。 pendingIntent执行的操作实质上是参数传进来的Intent的操作, 但是使用pendingIntent的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。 主要的使用的地方和例子:通知Notificatio

Android使用Intent传递对象

文章目录 Android使用Intent传递对象Serializable方式Parcelable方式 Android使用Intent传递对象 Intent的用法相信你已经比较熟悉了,我们可以借助它来启动活动、发送广播、启动服务等。在进行上述操作的时候,我们还可以在Intent中添加一些附加数据,以达到传值的效果,比如在FirstActivity中添加如下代码: Intent

android-Intent,Injector,Template,Adapter,Validation,Gesture,Game,Game Engine,Bluetooth...

Intent Intent PhotoPicker 图片选择 & 图片预览https://github.com/donglua/PhotoPicker Injector AndroidAnnotations Fast Android Development. Easy maintainance. https://github.com/excilys/androidannotations

遇到“Interpreter parsed an intent ‘xxx‘ which is not defined in the domain“报错

运行rasa shell的时候遇到如图报错: 从字面意思来看是这个”show_tasks”的intent没有在domain中定义。但是我打开domain.yml检查,domain里面是包含了这个intent的。那又是怎么回事呢? 遇到这个报错,不仅仅要检查domain.yml,还要查看nlu.md这个文件,要比对两个文件中intent的命名是否一致?若命名不一致,则会在rasa shell

【Android应用开发】Intent和PendingIntent的区别

intent英文意思是意图,pending表示即将发生或来临的事情。 PendingIntent这个类用于处理即将发生的事情。比如在通知Notification中用于跳转页面,但不是马上跳转。 Intent 是及时启动,intent 随所在的activity 消失而消失。 PendingIntent 可以看作是对intent的包装,通常通过getActivity,getBroadcast

Android中的Intent Filter匹配规则介绍

本文主要介绍了隐式Intent匹配目标组件的规则,若有叙述不清晰或是不准确的地方希望大家指出,谢谢大家:  ) 1. Intent简介 Intent用于在一个组件(Component,如Activity、Service、Broadcast Receiver)中打开另一个组件。 Intent可分为隐式(implicitly)和显式(explicitly)两种: Explicitly

怎么解析PendingIntent,从而得到其中描述的Intent

PendingIntent是一种特殊的Intent,它可以在稍后的某个时间点或者某个特定的事件发生时被触发。它可以用来启动一个Activity,发送一个Broadcast或者启动一个Service。 要解析PendingIntent,首先需要获取它的Intent对象,可以使用PendingIntent的getIntent()方法来获取。然后,可以使用Intent的getAction()、ge

Android静态安全检测 - Intent隐式调用

Intent隐式调用 - android.content.Intent 一、API 1. 继承关系 【1】java.lang.Object 【2】android.content.Intent 2. 主要方法 【1】构造方法   Intent()  Intent(String action)   Intent(Context context,

Intent传递对象的几种方式

原创文章,转载请注明 http://blog.csdn.net/leejizhou/article/details/51105060 李济洲的博客 Intent的用法相信你已经比较熟悉了,Intent可以用来启动Activity,Service等等,同时我们也可以通过Intent来进行传递数据,比如以下代码 <code class="hljs avrasm has-numbering"

使用Intent在活动之间穿梭

文章目录 使用Intent在活动之间穿梭使用显式Intent使用隐式Intent更多隐式Intent的用法 使用Intent在活动之间穿梭 Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务以及发送广播等场景,由于服务、广播等概念你暂时还未涉及,那么本