在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个参数表示要跳转到的目标Activity
Intent 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由Type和URL两部分组成,全相同才匹配。
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。
<activity
android: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中添加属性
<activity
android: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>
二、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");
... ...
}
}