zoukankan      html  css  js  c++  java
  • Intent:组件通信与广播消息的工具


    #### Intent的用途:
    • Intent可以启动其他组件,如Activity以及Service.并且在启动一个新的组件或者被启动组件返回时,都可以使用Intent携带信息,传递数据.
    • Intent的另一个用途是在Android系统上发布信息.广播信息可以是程序内部信息,也可以是第三方程序信息,系统信息.应用程序通过注册Intent过滤器可以获得这些广播消息.

    总结:Intent可以用于组件之间的数据交换和发送广播消息.


    利用Intent启动Activity:

    使用Intent启动Activity有两种方式:

    • 隐式启动:通过指定一组动作,和数据实现
    Intent intent=new Intent(String action, Uri uri);
    startActivity(intent);            
    
    //如果需要设置mimetype类型(不懂就暂时忽略,继续看,下文解析)
    Intent intent=new Intent();
    intent.setAction("");
    intent.addCatogary("");
    intent.setDataAndType("","");         //或者intent.setData,具体根据清单文件配置
    startActivity(intent);
    
    • 显示意图:通过指定具体的activity实现
    Intent intent=new Intent(this,TestActivity.class);
    startActivity(intent);
    

    拓展:在隐式启动Activity的过程中,既然没有指定特定的Activity类,那么android系统就应该是通过Intent中的action,category,data信息匹配符合条件的Activity启动的.这个过程是如何匹配的呢?

    当隐式意图发送后,系统会筛选每个应用的AndroidManifest.xml的组件下定义的节点

            <activity android:name=".ListActivity" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                    <data android:host="" android:scheme="" android:mimeType=""></data>
                </intent-filter>
            </activity>
    

    如果节点中的action,category,data信息与Intent中的匹配,该应用组件就作为制定Activity启动了.

    例如:利用隐式意图跳转默认浏览器打开网页

    Intent intent=new Intent();
    String s=new String("https://www.artic.edu/collection?is_public_domain=1");
    intent.setData(Uri.parse(s));
    intent.setAction(Intent.ACTION_VIEW);
    startActivity(intent);
    

    #### 利用意图在Activity间传递数据:
    1. 从父Activity传递数据到子Activity

      父Activity要实现代码:

      String name="eason";
      Intent intent=new Intent(this,TestActivity.class);
      intent.putExtra("name",name);					//Activity间数据传递的方法
      startActivity(intent);
      

      子Activity要实现代码:

      Intent intent=getIntent();
      String name=intent.getStringExtra("name");		//传递的是什么数据类型,就按照传递的数据类型取
      
    2. 从子Activity传递数据到父Activity

      在TestActivity.class页面中点击按钮把选中号码返回,

      子Activity要实现代码:

      public void onclick(View view){
      Intent intent=new Intent();
      String phone="123";
      intent.putExtra("phone",phone);
      setResult(int RuasultCode,intent);
      finish();					//该方法将结束当前Activity,返回唤醒该Activity的Activity
      }
      

      父Activity要实现代码:

      1. 采用startActivityForRequest()方法而不是startActivity()

        Intent intent=new Intent(this,TestActivity.class);
        
        //设置请求码,startActivityForResult(Intent intent,int requestcode)
        startActivityForResult(intent,int requestcode);	
        
        
      2. 重写方法onActivityResult()

        //该方法在TestActivity关闭时调用
        protected void onActivityResult(int requestCode,int resultCode,Intent data){
        //通过请求码或者结果码,可以辨别返回数据的来源
         if(resultCode==){
        }
        }
        

    #### 利用Intent发送广播
    Intent intent=new Intent("android.intent.action.NEW_OUTGOING_CALL");
    intent.puExtra("message",String string);
    

    #### 利用broadcastReceiver接收广播事件

    与Activity的使用类似,想利用BroadcastReceiver接收广播,需要建立一个子类继承BroadcastReceiver,并且在清单文件中声明recevier.

    假如现在要建立一个监听外拨电话的广播事件,那么首先要在包下兴建一个子类继承BroadcastReceiver

    public class IpRecevier extends BroadcastReceiver {
        @Override
        //该方法将在接受到广播时调用
        public void onReceive(Context context, Intent intent) {
        String string=intent.getStringData("message");
        System.out.print(string);
    }
    

    然后需要在清单文件中声明新建的子类:

    <Application...
            <receiver android:name="自定义子类名">
                <intent-filter>
                    <action android:name="android.intent.action.NEW_OUTGOING_CALL">		</action>
                </intent-filter>
            </receiver>
    

    正常情况下,只需要添加想检测事件的action就可以了,有两个广播事件需要添加数据约束.

    1.检测sd卡挂载的广播事件,sd卡存的是file,所以添加约束类型"file"

            <receiver android:name="com.example.eason.news.IpRecevier">
                <intent-filter>
                    <action android:name="android.intent.action.MEDIA_MOUNTED"></action>
                    <data android:scheme="file"/>
                </intent-filter>
            </receiver>
    

    2.检测应用的安装,卸载,应用安装和卸载的文件类型是包,所以添加约束类型"package"

            <receiver android:name="com.example.eason.news.IpRecevier">
                <intent-filter>
                    <action android:name="android.intent.action.PACKAGE_ADDED"></action>
                    <action android:name="android.intent.action.MEDIA_REMOVED"></action>
                    <data android:scheme="package"/>
                </intent-filter>
    
  • 相关阅读:
    高效求解素数
    搭建redis集群
    搭建Spark高可用集群
    redis持久化
    elasticsearch简介
    java反射机制
    hdfs的客户端操作
    hdfs运行机制
    大数据概念
    hive
  • 原文地址:https://www.cnblogs.com/adressian/p/9949969.html
Copyright © 2011-2022 走看看