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个参数表示要跳转到的目标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由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



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之间的数据传递

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界面。

Intent与IntentFilter_第1张图片

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");
        ... ...
    }
}

你可能感兴趣的:(android,java)