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>
    
  • 相关阅读:
    HDU 1124 Factorial
    hdu 1690 Bus System
    hdu 1113 Word Amalgamation
    POJ 2482 Stars in Your Window
    hdu 1385 ZOJ 1456 Minimum Transport Cost(经典floyd)
    hdu 1907 John
    VMware 虚拟机 安装 UBuntu 9.10 命令模式转换成窗口模试
    #pragma CODE_SEG __NEAR_SEG NON_BANKED详解
    Ubuntu 下Hadoop 伪分布式 hadoop0.20.2.tar.gz 的安装
    文件拷贝代码以及疑问
  • 原文地址:https://www.cnblogs.com/adressian/p/9949969.html
Copyright © 2011-2022 走看看