Android

2018-06-07-Intent

2018-06-07  本文已影响0人  天才蒙蒙亮

Intent

Android中提供了Intent机制来协商引用之间的交互和通讯,或者采用更加准确的是说法是,Intent不仅可以用与应用程序内部的activity,service和broadcasst receiver之间的交互。Intent这个英语单词的本意是目的、意图。

Intent是一种运行时绑定(running binging)机制,它能在程序运行的过程中连接两个不同的组件。通过Intent,你的程序可以向Android表达某种请求或者医院,Android会更具医院的内容选择适当的组件来响应。

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

使用Context.startActivity()或Activity.startActivityForResult(),传入一个intent来启动一个Activity。
使用Activity.seetResult(),传入一个intent来从activty中返回结果。
将intent对象传给Context.startService()来启动一个service或者传消息给一个运行的service。
将intent对象传递给Context.bindService()绑定一个service。
将对象传给Context.sendService()来绑定一个service。
将intent对象传给Context.sendBroadcast(),Context.sendOrderedBroadcast(),或者Context.sendStickyBroadCast()等广播方法,则他们被传给broadcast receiver。

Intent由以下各个组成部分:

  1. component(组件):目的组件
  2. Action(动作):用来表现意图的行动
  3. category(类别):用来表现动作的类别
  4. data(数据):表示与动作要操作的数据
  5. type(数据类型):对于data范例的描写
  6. extras(扩展信息):扩展信息
  7. Flags(标志位):期望这个意图的运行模式

Intent分为直接Intent和间接Intent

/**
     * 直接查找法,通过组件名称查找intent
     * @param v
     */
    public void compentClick(View v){
    
                        //方法一:
//        Intent intent = new Intent();
//        //组件名称
//        ComponentName componentName = new ComponentName(this,MainActivity2.class);
//
//        //通过intent设置组件名称直接跳转
//        intent.setComponent(componentName);


        //方法二:
        Intent intent = new Intent(this,MainActivity2.class);


        //启动Activity
        startActivity(intent);
    }
}

Intent的相关属性

Action

用来表现意图的行动

在Intent中,Action就是描述看、写、做等动作的,当你指定了一个Action,执行者就会依照这个动作的指示,接受相关输入,表现对应行为,产生符合的输出。在Intent类中,定义了一批量的动作,比如,Action_VIEW,ACTION_PICK等,基本涵盖了常用动作。

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

被匹配的Activity的Manifest文件指定自己的Action

<!--默认Action没有配置category时,必须写 <category android:name="android.intent.category.DEFAULT"></category> -->

<activity
            android:name=".MainActivity3"
            android:label="@string/title_activity_main3"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="com.example.action.MY_ACTION"/>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>

点击跳到一个Activity

//间接查找,通过action动作
    public void actionClick(View v){
        Intent intent = new Intent();
       
        //对应的Action的名称应该相同,一般是包名后.action.大写名字      intent.setAction("com.example.action.MY_ACTION");

        startActivity(intent);
    }

Category

Manifest文件配置,必须有
category的默认类别

<activity
            android:name=".MainActivity3"
            android:label="@string/title_activity_main3"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="com.example.action.MY_ACTION"/>
                <category android:name="com.example.category.MY_CATEGORY"></category>
                <category android:name="android.intent.category.DEFAULT"></category>
            </intent-filter>
        </activity>

Activity

//间接查找,通过category动作
    public void actionClick(View v){
        Intent intent = new Intent();
        intent.setAction("com.example.action.MY_ACTION");
        intent.addCategory("com.example.category.MY_CATEGORY");
        startActivity(intent);
    }

Data

Manifest

<activity
            android:name=".MainActivity4"
            android:label="@string/title_activity_main4"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="com.example.action.MY_ACTION"></action>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http" android:host="www.baidu.com"></data>
            </intent-filter>
        </activity>

Activity

/**
     * data实际上是一个URI,需要搭配Action使用
     * @param v
     */
    public void dataClick(View v){
        Intent intent = new Intent();
        intent.setAction("com.example.action.MY_ACTION");
        Uri data = Uri.parse("http://www.baidu.com");
        intent.setData(data);

        startActivity(intent);

    }/**
     * data实际上是一个URI,需要搭配Action使用
     * @param v
     */
    public void dataClick(View v){
        Intent intent = new Intent();
        intent.setAction("com.example.action.MY_ACTION");
        Uri data = Uri.parse("http://www.baidu.com");
        intent.setData(data);

        startActivity(intent);

    }/**
     * data实际上是一个URI,需要搭配Action使用
     * @param v
     */
    public void dataClick(View v){
        Intent intent = new Intent();
        intent.setAction("com.example.action.MY_ACTION");
        Uri data = Uri.parse("http://www.baidu.com");
        intent.setData(data);

        startActivity(intent);

    }

Type

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

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

Type和Data
清单配置文件

<activity
            android:name=".MainActivity4"
            android:label="@string/title_activity_main4"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="com.example.action.MY_ACTION"></action>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http" android:host="www.baidu.com" android:mimeType="text/html"></data>
            </intent-filter>
        </activity>

Activity

public void dataClick(View v){
        Intent intent = new Intent();
        intent.setAction("com.example.action.MY_ACTION");
        Uri data = Uri.parse("http://www.baidu.com");
        intent.setData(data);

        //type用来表示数据的类型
        //源码中设置Data会把Type
        //两个都设置,用以下属性

        intent.setDataAndType(data,"text/html");

        startActivity(intent);

    }

extras扩展信息
传自定义的对象,序列化,参考Activity

Flags标志位

一个程序启动系统会为这个程序分配一个Task供使用,另外同一个task里面可以拥有不同应用程序的Activity。一个程序能不能拥有多个Task?这就涉及到加载activty的四种模式:standard、singleTop、singleTask、singleInstance,可以在AndroidManifest.xml中activtiy标签属性launchMode中设置该activity的加载模式。简述一下四种模式的区别:

  1. standard模式:默认的模式,以这中模式加载爱必定会构造一个新的Activity实例,方到目标的Task中的Activity栈顶,不管当前栈顶是什么情况
    2.singleTop模式:这种模式与standard模式类似,区别在于加载activity会多个判断步骤。判断需要加载的新的Activity与当前task栈顶的Activity是不是同一个,相同的话就不再构造新的activity,并调用这个Activity的new Instance()方,不相同就还会构造新的activity放到栈顶
    3.singleTask模式:这种模式下,会创建一个新的task来加载这个activity,并且这个Task值允许存在一个activity实例(以后可以加载其他activity的实例)
    sinaleInstance模式:这种模式下,会创建一个新的task,并且这个Task中只能存在一个需要加载的Activity实例(以后可以加载其他activity)。

standard:

清单文件

<activity
            android:name=".MainActivityA"
            android:label="@string/title_activity_main"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivityB"
            android:label="@string/title_activity_main_activity_b"
            android:theme="@style/AppTheme.NoActionBar"
            android:launchMode="standard">
        </activity>
    </application>

AB两个activity的布局文件

<Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="使用action属性查找"
        android:id="@+id/button_action"
        android:onClick="actionClick"
        android:layout_below="@+id/button_comp"
        android:layout_alignParentEnd="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="使用data属性查找组件"
        android:id="@+id/button_data"
        android:onClick="dataClick"
        android:layout_below="@+id/button_action"
        android:layout_alignParentEnd="true"
        android:layout_alignParentStart="true" />

AB两个Activity

 public void startA(View v){
        Intent intent = new Intent(this,MainActivityA.class);
        startActivity(intent);
    }
    public void startB(View v){
        Intent intent = new Intent(this,MainActivityB.class);
        startActivity(intent);
    }

Intent应用

显示网页

Uri uri = Uri.parse("http://www.baidu.com");
        Intent it = new Intent(Intent.ACTION_VIEW,uri);
        startActivity(it);

拨打电话

打开打电话的界面:

Uri uri = Uri.parse("tel:xxxxxxx");
        Intent it = new Intent(Intent.ACTION_DIAL,uri);
        startActivity(it);

打电话:

Uri uri = Uri.parse("tel:xxxxxxx");
        Intent it = new Intent(Intent.ACTION_CALL,uri);
        startActivity(it);
        
        //使用这个必须在配置文件中加入<uses-permission android:name="android.permission.CALL_PHONE"/>
        

调用发送短信的程序

Intent it = new Intent(Intent.ACTION_VIEW);
        it.putExtra("sms_body","The SMS text");
        it.setType("vnd.android-dir/mms-sms");
        startActivity(it);

发送短信

Uri uri = Uri.parse("smsto:xxxxxxx");
        Intent it = new Intent(Intent.ACTION_SENDTO,uri);
        it.putExtra("sms_body","The SMS text");
        startActivity(it);
上一篇下一篇

猜你喜欢

热点阅读