zoukankan      html  css  js  c++  java
  • Android四大组件通信的Intent介绍和详解

    Intent主要的作用是减少组件间的耦合,并且Intent提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递Intent来执行动作和产生事件。使用Intent可以激活Android应用的三个核心组件:活动、服务和广播接收器。

    Intent可以划分成显式意图和隐式意图。

    显式意图:调用Intent.setComponent()或Intent.setClass()方法明确指定了组件名的Intent为显式意图,显式意图明确指定了Intent应该传递给哪个组件。

    隐式意图:没有明确指定组件名的Intent为隐式意图。 Android系统会根据隐式意图中设置的动作(action)、类别(category)、数据(URI和数据类型)找到最合适的组件来处理这个意图。

    1.1下面先介绍下显示意图的四种写法(注意第3种写法有两种)

    1 //第1种显示的打开OtherActivity  OtherActivity.class为Activity类
    2 Intent intent = new Intent(this, OtherActivity.class);
    3 //第2种    OtherActivity.class为类
    4 Intent intent  = new Intent();
    5 intent.setClass(this, OtherActivity.class);
    6 //第3种   com.xxx.activitys.OtherActivity 为Activity类加上包名  intent.setClassName("", ""); 第一参数为应用的包名 第二个为包名和类名 这个可以跨应用访问组件
    7 intent.setClassName(this, "com.xxx.activitys.OtherActivity")
    8 //第4种 OtherActivity.class 为Activity类名   
    9 intent.setComponent(new ComponentName(this, OtherActivity.class));

    1.2隐式意图的写法

      第一步在你想要到的目的地(所谓的要跳转的Activity,BroadcastReceiver,Service)添加<intent-filter > </intent-filter >

      例如:

      

    <activity android:name=".OtherActivity" android:label="@string/title">
                <intent-filter >
                    <action android:name="com.xx.zhangxx"/>
                    <action android:name="com.xx.hello"/>
                    <category android:name="com.xx.category.java"/> 
                    <category android:name="android.intent.category.DEFAULT"/>
                    <category android:name="com.xx.category.php"/>
                    <data android:scheme="myscheme" android:host="www.xx.com" android:path="/xx"/>
                    <data android:mimeType="image/*"/>
                </intent-filter>            
            </activity>

    注意的事项:

      1.<category android:name="android.intent.category.DEFAULT"/> 这个category 必须写上 因为在系统的默认的情况下会自动添加上这个category 

      2.在只有action 和category的匹配的时候只需要对应出一个action和category 即可 匹配成功

      3.<data android:scheme="myscheme" android:host="www.xx.com" android:path="/xx"/> 匹配的路径应该是 myscheme://www.xx.com/xx

      4.使用data中的 路径和mimeType都存在的时候需要使用的方法setDataAndType  不能单开写 否则会出错

      隐式意图在Java中的写法

    1 Intent intent = new Intent();//隐式意图激活Activity
    2 intent.setAction("com.xx.zhangxx"); //只需要匹配一个即成功
    3 intent.addCategory("com.xx.category.java");   //只需要匹配一个即成功
    4  intent.setDataAndType(Uri.parse("myscheme://www.xx.com/xx"), "image/jpeg");

    Intent携带数据到另一组件的问题

    1.1启动另一个组件的方法

    startActivity(intent);//启动到另一组件 但是不会接受进入到的另一组件的关闭/来电话等等打断或其它意外的情况的返回数据
    startActivityForResult(intent, 100); //第二个参数为请求码 启动到另一组件 会接受进入到的另一组件的关闭/来电话等等打断或其它意外的情况的返回数据

    1.2

    1.2.1使用Intent从一个组件到另一个组件传递数据

    //在第一个组件中放入参数
    Intent intent = new Intent(this, OtherActivity.class);
    intent.putExtra("company", "我的Android工厂");
    intent.putExtra("age", 5);
    startActivity(intent);
    //在第二个组件中接受参数的值
    Intent intent = getIntent();//获取用于激活它的意图对象
    String company = intent.getStringExtra("company");
    int age = intent.getIntExtra("age", 0);

    1.2.2使用Bundle传入多条数据

    //在第一个组件中放入数据到Bundle 中
    Intent intent = new Intent(this, OtherActivity.class);
    Bundle bundle = new Bundle();
    bundle.putString("company", "我的Android公司");
    bundle.putInt("age", 5);
    intent.putExtras(bundle);
    startActivity(intent);
    //在第二个组件中接受数据 Intent intent = getIntent();//获取用于激活它的意图对象 Bundle bundle = intent.getExtras(); String company = bundle.getString("company"); int age = bundle.getInt("age");

    1.3第二个组件关闭或者意外后返回数据的写法

       第一步:需要在第一个组件到第二个组件使用startActivityForResult(intent, 100);方法

     第二步:在第一个组件中重写方法onActivityResult

      

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    //requestCode 为设置的等待的请求码  也就是上述的100
    //resultCode 为在第二个组件中设置的结果码 
    //data 为在第二个组件返回的数据
            String result = data.getStringExtra("result");
            Toast.makeText(getApplicationContext(),result, 1).show();
            
            super.onActivityResult(requestCode, resultCode, data);
    }

     第三步:在第二个组件中intent中放入数据调用方法setResult(20, intent);//设置返回数据

      例如:

    Intent intent = new Intent();
    intent.putExtra("result", "我是第二个组件的返回的结果!");
    setResult(20, intent);//设置返回数据
    finish();//关闭Activity(关闭窗口)

    希望对大家有帮助,有疑问欢迎提出问题,大家一起讨论和解决

      

  • 相关阅读:
    android studio解决微信登录,百度地图等调试问题
    Android studio初入的各种坑
    react native环境配置及各种坑
    单例模式序列化后反序列化单例失效的问题
    react native 初识react native
    Fragment 点击事件的穿透和重叠bug
    转载:android——eclipse如何去除Ctrl+shift+R组合键查找到的.class文件
    分布式队列Celery
    vue-生命周期
    vue-实现倒计时功能
  • 原文地址:https://www.cnblogs.com/m314100757/p/4689267.html
Copyright © 2011-2022 走看看