zoukankan      html  css  js  c++  java
  • Intent详解

    1、什么是Intent

    Android提供了Intent机制来协助应用建的交互与通讯,或者采用更准确的说法是,Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity,service和broadcast receiver之间的交互,intent这个词本意是“目的、意向、意图”。

    Intent是一种运行时绑定(runtime binding)机制,他能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或意愿,Android会根据意愿的内容选择适当的组件来响应。

     对于像这三种组件发送intent有不同的机制:

    使用Context.startActivity()或Activity.startActivityForResult(),传入一个intent来启动一个activity。

    使用Activity.setResult(),传入一个intent来从activity中返回结果

    将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。

    将intent对象传给Context.bindService()来绑定一个service。

    将intent对象传给Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadcast()等广播方法,则他们被传给broadcast receiver。

    2、Intent的相关属性

    intent由一下各个组成部分:

    2.1component(组件):目的组件

    Intent intent = new Intent();
    ComponentName componentName = new ComponentName(this,PhoneNumberListActivity.class);
    intent.setComponent(componentName); 

    2.2Action(动作) :用来表现意图的行动

    Action是一个用户定义的字符串,用于描述一个Android应用程序组件,一个Intent Filter可以包含多个Action。在AndroidManifest.xml的Activity定义时可以在其<intent-filter>节点指定一个Action列表,用于标识Activity所能接受的“动作”。

    //需要在AndroidManifest.xml中添加intent-filter,为Activity时,必须加上category属性
            <activity android:name=".PhoneNumberListActivity">
                <intent-filter>
                    <action android:name="action_MY_ACTION"></action>
                    <category android:name="android.intent.category.DEFAULT"></category>
                </intent-filter>
            </activity>
    
    //代码
            //间接法(通过Action属性)
            Intent intent = new Intent();
            intent.setAction("action_MY_ACTION");
            startActivity(intent);

    如果有多个符合条件,则出现界面自己选择,可以设置优先级,android:priority="2",但是程序中必须有一个优先级为负数才能生效。

            <activity android:name=".WelcomeActivity">
                <intent-filter android:priority="-1">
                    <action android:name="action_MY_ACTION"></action>
                    <category android:name="android.intent.category.DEFAULT"></category>
                </intent-filter>
            </activity>
            <activity android:name=".PhoneNumberListActivity">
                <intent-filter android:priority="1">
                    <action android:name="action_MY_ACTION"></action>
                    <category android:name="android.intent.category.DEFAULT"></category>
                </intent-filter>
            </activity>

    2.3category(类别):用来表现动作的类别

    <activity android:name=".PhoneNumberListActivity">
        <intent-filter android:priority="1">
            <action android:name="action_MY_ACTION"></action>
    
            <category android:name="android.intent.category.DEFAULT"></category>
            <category android:name="category.MY_CATEGORY"></category>
        </intent-filter>
    </activity>
    
    
    //间接法(通过Action属性)
    Intent intent = new Intent();
    intent.setAction("action_MY_ACTION");
    //添加类别
    //在Activity的清单文件配置中,必须使用默认的类别android.intent.category.DEFAULT
    intent.addCategory("category.MY_CATEGORY");
    startActivity(intent); 

    2.4data(数据): 表示与动作要操纵的数据

    Data属性是Android要访问的数据,和action和category声明方式相同,也是在<intent-filter>中,多个组件匹配成功优先显示优先高的,优先级相同则显示列表。

    <activity android:name=".PhoneNumberListActivity">
       <intent-filter android:priority="1">
          <action android:name="action_MY_ACTION"></action>
    
          <category android:name="android.intent.category.DEFAULT"></category>
          <category android:name="category.MY_CATEGORY"></category>
    
       <data
            android:host="www.baidu.com"
            android:scheme="http"></data>
       </intent-filter>
    </activity>
    
    
    //间接法(通过Action属性)
    Intent intent = new Intent();
    intent.setAction("action_MY_ACTION");
    
    //data属性,一般与action配合使用
    Uri data = Uri.parse("http://www.baidu.com");
    intent.setData(data);
    startActivity(intent); 

    2.5type(数据类型):对于data范例的描写

    如果Intent对象中既包含Uri又包含Type,那么,在<intent-filter>中必须二者都包含才能通过测试

    Type属性则用于明确指定Data属性的数据类型或MIME类型,但是通常来说,当intent不指定data属性时Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,所以无需指定Type属性。

            //data属性,type
            Uri data = Uri.parse("http://www.baidu.com");
            /**
             * intent.setData(data);//会把type设置为null
             * intent.setType(); //会把data设置为null
             * 要是用data与type,必须使用以下方法
             */
            intent.setDataAndType(data,"text/html");
            startActivity(intent); 

    2.6extras(扩展信息):扩展信息

    2.7Flags(标志位):期望这个意图的运行模式

    Activity的四种模式:standard、singletop、singleTask、singleInstance,可以在AndroidManifest.xml中activity标签的属性launchMode中设置该activity的加载模式。

    /**
     * Activity的四种启动模式:
     * standard:默认的模式,每次启动会新创建一个Activity对象
     * singleTop:在当前任务栈中,判断站定是否为当前的Activity,如果是,则直接使用,不是则创建新的Activity放入栈顶
     * singleTask:在当前任务栈中,判断站里是否存在Activity,如果不存在则创建新的Activity入栈,
     * 如果存在则会把该Activity清除出栈,显示当前Activity
     * singleInstance:新创建一个任务栈,放入新创建的Activity,该任务栈只允许存在一个Activity实例
     */ 

    也可以在代码中设置Activity的启动模式

            Intent intent = new Intent(this, PhoneNumberListActivity.class);
            //设置Activity的启动模式
            /**
             * Intent.FLAG_ACTIVITY_NEW_TASK:在新的任务栈中启动Activity
             */
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(intent); 

    Intent分为直接Intent和间接Intent

    3、Intent应用

            //显示网页
            Uri uri = Uri.parse("http://www.baidu.com");
            Intent intent = new Intent(Intent.ACTION_VIEW,uri);
            startActivity(intent);
            //拨打电话,调用拨号程序,打开拨号面板
            Uri uri = Uri.parse("tel:123456789");
            Intent intent = new Intent(Intent.ACTION_DIAL,uri);
            startActivity(intent);
    
            //拨打电话,直接拨号
            Uri uri = Uri.parse("tel:123456789");
            Intent intent = new Intent(Intent.ACTION_CALL,uri);
            startActivity(intent);
    
            //注意:要是用这个必须在配置文件中加入
            <uses-permission android:name="android.permission.CALL_PHONE" />
    

    //调用发送短信的界面 Intent intent = new Intent(Intent.ACTION_VIEW); intent.putExtra("sms_body","The SMS text"); intent.setType("vnd.android-dir/mms-sms"); startActivity(intent); //发送短信 Uri uri = Uri.parse("smsto:0800000123"); Intent intent = new Intent(Intent.ACTION_SENDTO,uri); intent.putExtra("sms_body","The SMS text"); startActivity(intent);
    //播放多媒体 Uri uri = Uri.parse("file:///sdcard/song.mp3"); Intent intent = new Intent(Intent.ACTION_VIEW,uri); intent.addFlags(intent.FLAG_ACTIVITY_NEW_TASK);//非必选项 intent.setDataAndType(uri,"audio/ma3"); startActivity(intent); //卸载程序 Uri uri = Uri.parse("package:包名"); Intent intent = new Intent(Intent.ACTION_DELETE,uri); startActivity(intent);
           //安装apk
            Uri uri = Uri.fromFile(file);
            Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.setDataAndType(uri,"application/vnd.android.package-archive");
            startActivity(intent);
  • 相关阅读:
    服务器×××上的MSDTC不可用解决办法
    安装VS2010后,更改iis的asp.net版本
    刷新后 页面 保持滚动条位置
    Atitit.java 反编译 工具  attilax 总结
    Atitit.收银系统模块架构attilax 总结
    Atitit.论垃圾文件的识别与清理 文档类型垃圾文件 与api概要设计pa6.doc
    atitit.guice3 绑定方式打总结生成非单例对象toInstance toProvider区别 v2 pb29
    Atitit. Derby的使用总结attilax
    Atitit.attilax的 case list 项目经验 案例列表
    Atitit.收银系统pos 以及打印功能的行业标准
  • 原文地址:https://www.cnblogs.com/chhom/p/4709840.html
Copyright © 2011-2022 走看看