Android Intent Bundle对象解析

本文介绍了Android中Intent的重要性和使用,特别是隐式Intent的工作原理。解析过程主要基于action、type和category进行匹配,寻找AndroidManifest.xml中合适的IntentFilter。此外,还详细讲解了如何在Activity间使用bundle传递数据,包括打包数据和获取数据的方法,以及通过startActivityForResult进行数据交换的过程。

 Android 三大重要的组件Activity、Service、Service、BroadcastReceiver通过Intent来启动,还用于被启动组件交换信息。

Intent分为显式的Intent和隐式的Intent

(1).显式的Intent明确目标接受者

ntent it = new Intent(Activity.Main.this, Activity2.class);

startActivity(it);  

(2).隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间,如下:

Intent it = new Intent();

it.setAction("com.google.test");

startActivity(it);

上面那个intent没有指明接收者,只是给了一个action作为接收者的过滤条件。

 对于显式IntentAndroid不需要去做解析,因为目标组件已经很明确,Android需要解析的是那些隐式Intent,通过解析,将Intent映射给可以处理此IntentActivityIntentReceiverService。        

 Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intentactiontypecategory这三个属性来进行判断的,判断方法如下:

· 如果Intent指明定了action,则目标组件的IntentFilteraction列表中就必须包含有这个action,否则不能匹配;

· 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。

· 如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme 进行匹配。

· 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。



下面介绍显式Intent Activity组件

Intent启动方法:startActivity(Intent intent)//开启一个新的Activity

                                startActivityForResult(Intent intent,int requestCode)  //开启一个新的Activity,返回结果给原Activity

如下图:



Ps:

requestCode:请求码,非负数。只有是非负数时,Activity退出时,这个码会返回到onActivityResult()。

resultCode:结果码,用于标识返回数据来自于哪个新Activity,直为:RESULT_CANCELED, RESULT_OK, RESULT_FIRST_USER。

bundle:一种存放字符串和Parcelable类型数据的map类型的容器类。主要用于Activity之间数据传递。

用法:

1.打包数据

Bundle bundle = new Bundle();//创建一个句柄

bundle.putString("name", nameinfo);//将nameinfo填充入句柄

Intent mIntent = new Intent(TestBundle.this,TestBundle_getvalue.class);

mIntent.putExtras(bundle);

startActivity(mIntent);

 2:获取数据

Bundle bundle = getIntent().getExtras();//获取一个句柄

String nameString=bundle.get("name");//通过key为“name”来获取value即 nameString



以下事例利用startActivityForResult进行数据交换:

原Activity

--------------------------------------------------------------------------

                //new 一个 Intent对象,并制定class
                Intent intent = new Intent();
                intent.setClass(MainActivity.this,JiSuanActivity.class);

                //new 一个Bundle对象,并要传递的数据传入
                Bundle bundle  = new Bundle();
                bundle.putDouble("height",height);
                bundle.putString("sex",sex);

                //将bunle 对象assign给Intent
                intent.putExtras(bundle);

                //调用Activity JiSuanActivity
                startActivityForResult(intent,0);
--------------------------------------------------------------------------

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch(requestCode){
            case RESULT_OK:
                /*取得来自JiSuanActivity的数据,并显示在画面上*/
                Bundle bundle = data.getExtras();
                String sex = bundle.getString("sex");
                double height = bundle.getDouble("height");

                break;
            default:
                break;

        }
    }

新Activity

---------------------------------------------------------

    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_jisuan_main);

        final Intent intent  = getIntent();
        Bundle bundle =intent.getExtras();

        Button bt = (Button) findViewById(R.id.Return);
        bt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                JiSuanActivity.this.setResult(RESULT_OK,intent);
                JiSuanActivity.this.finish();
            }
        });
    }







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值