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

    1.Intent对于Android应用的作用

    大体可以分为两个功能:

    ① 封装Android应用程序需要启动某个组件的“意图”

    ② 作为应用组件之间的通信的媒介,将需要交换的数据封装成Bundle对象,然后使用Intent来携带Bundle对象

    2.Intent对象详解

    2.1 使用Intent启动系统组件

    启动Activity:startActivity(Intent intent)

    startActivityForResult(Intent intent,int requestCode)

    启动Service:ComponentName startService(Intent intent)

    boolean bindService(Intent service,ServiceConnection conm,int flags)

    启动BroadcastReceiver:sendBroadcast(Intent intent)

    sendBroadcast(Intent intent,String recePermission)etc

    2.2 Intent的属性及intent-filter配置

    Intent代表了Android应用启动一个应用的意图,Android应用将会根据Intent来启动指定组件,

    至于启动哪个组件,就需要根据不懂的属性值来判断。

    2.2.1 Component属性

    首先介绍一个组件的概念:包括Service(服务),Activity(活动),Content(内容),

    Intent(意图),BroadcastRece(广播),Notification(通知)

    Intent的Component(成分)属性接受一个叫做ComponentName的值,ComponentName的结构器有:

    Component(String pkg)//创建pkg所在包下的cls类所对应的所有组件

    Component(String pkg,String cls)//创建pkg所对应的包下的cls类所对应的组件

    Component(String pkg,Class cls)//创建pkg所对应的包下的cls类所对应的组件

    他们的都是根据包明和类名去确定一个组件 然后启动它

    还可以通过Intent的setClass(Context package,Class cls),setClassName(Context packageContext,String className)

    setClassName(Strong packageName,String className)来指定该Intent要启动的组件

    这种明确的指定启动哪个组件的叫做显式Intent 还有一种根据规则去启动和服规则的组件的叫做隐式Intent

    for example 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    HelloWorld1.java
     
    Intent intent = new Intent();
    ComponentName component = new ComponentName(HelloWorld1.this,HelloWorld2.class);
    intent.setComponent(component);
    startActivity(intent);
     
    HelloWorld2.java
     
    ComponentName component = getIntent().getComponent();//可以通过Intent获取Component的值

    2.2.2 Action、Category属性与intent-filter配置

    Intent的Action、Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象动作,而Category则用于

    为Action增加额外的附近类别信息。通常Action与Category属性会结合使用。

    当一个Activity或者其他的组件的配置信息中的Action和Category的值是多少。通常包括0~N个子元素

    0~N个子元素 和 0~1个子元素。这就是相当一个妹子要找嫩朋友的条件。

    当Intent设置的Action和Category全部满足组件的Action和Category时,该组件就会被打开了,这就相当于一个男孩子完全满足了妹子找的

    条件后就在一起了。

    一般来说,Intent一般只会指定一个Action,但是可以指定多个Category

    2.2.3 指定Action、Category调用系统Activity

    Action和Category的对应表 点击打开链接

    2.2.4 Data、Type属性与intent-filter配置

    Data属性通常用于向Action属性提供操作数据,Data属性接受一个uri对象,uri通常通过如下形式的字符串来表示:

    1
    2
    content://com.android.contacts/contacts/1
    tel:123

    uri字符串要满足如下格式:

    scheme://host:port/path

    content是scheme部分,com.android.contacts是host部分,port部分被省略,/contacts/1是path部分

    Type属性用于指定该Data所指定uri对应的MIME类型,这种MIME类型可以是任何自定义的MIME类型,

    只要符合abc/xyz格式的字符串即可。

    Type和Data属性有时候会相互覆盖,例如:Intent先设置Data属性再设置Type属性,Tpye就会覆盖Data

    属性,反之亦然。解决方法就是设置调用setDataAndType()方法

    对应的,在AndroidMainifest.xml文件中通过元素来设置Type,Data属性值

    元素支持如下属性:

    mimeType:用于声明该组件所匹配的Intent的Type属性

    scheme:用于声明该组件所匹配Intent的Data属性的scheme部分

    data:用于声明该组件所匹配的Intent的Data属性的host部分

    host:用于声明该组件所匹配的Intent的Data属性的host部分

    port:用于声明该组件所匹配的Intent的Data属性的port部分

    path:用于声明该组件所匹配的Intent的Data属性的path部分

    pathPrefix:用于声明该组件所匹配的Intent的Data属性的path前缀

    pathPattern:用于声明该组件所匹配的Intent的Data属性的path字符串模板

    启动组件的时候Type必须完全符合,但是Intent的data值只设置了一部分,则只需要满足设置的那部分就能启动了。

    2.2.5 Extra属性

    Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bnudle对象,Bundle

    对象就是一个Map对象,可以存入多对key-value值

    2.2.6 Flag属性

    Flag属性用于为该Intent添加一些额外的控制旗杆,可以调用addFlags()方法来为Intent添加控制旗杆

    Flag属性的对应表 点击打开链接 

    2.3 使用Intent创建Tab页面

    在不同的Tab页面下的content为一个Activity

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    TabHost tabHost = getTabHost();
    TabHost.addTab(tabHost.newTabSpec("tab1")
                          .setIndicator("已接电话")
                          .setContent(new Intent(this,HelloWorld1.class)
                                           )
                           );
     
    TabHost.addTab(tabHost.newTabSpec("tab2")
                          .setIndicator("未接电话")
                          .setContent(new Intent(this,HelloWorld2.class)
                                           )
                           );
     
    TabHost.addTab(tabHost.newTabSpec("tab3")
                          .setIndicator("呼出电话")
                          .setContent(new Intent(this,HelloWorld3.class)
                                           )
                           );

    结伴旅游,一个免费的交友网站:www.jieberu.com

    推推族,免费得门票,游景区:www.tuituizu.com

  • 相关阅读:
    设计模式-抽象工厂模式
    装修预算-资料收集
    SQL中存储过程和函数的区别
    View
    数据表优化
    Entity Framework 基础
    html5标准
    JS整数验证
    vue 页面切换从右侧切入效果
    vue动态设置Iview的多个Input组件自动获取焦点
  • 原文地址:https://www.cnblogs.com/rabbit-bunny/p/4283291.html
Copyright © 2011-2022 走看看