【Android】Intent介绍和使用

来源:互联网 发布:在vb中val是什么意思 编辑:程序博客网 时间:2024/05/17 22:47

Intent是什么


            通信技术不发达时,人们通过信件的方式通信,其中邮递员起到了传递信息的作用。在Android系统中,组件之间的通信员就是Intent,它使得组件间得以通信。


    Intent,中文翻译成“意图”,最常见的用途是绑定应用程序组件。通过Intent,你的程序组件可以向Android表达某种意图,Android会根据你的意图内容选择合适的组件来完成请求。比如,你要打开一个文本文件,而你的手机里面有超过两个阅读器,这时候会弹出一个界面,里面让你选择要用的阅读器。还有就是你希望用一个按钮打开一个网页的内容,比如说要打开百度页面,就可以利用Intent来打开。总的来说,我们通过Intent传入某种意图,而Android会根据这种意图,自动寻找合适的activity来启动,如果有多个条件符合的activity,就以列表的方式让用户手动选择。它有两种寻找组件的方式,分别是显式intent和隐式intent。




显式Intent

    

     显式意图有两种激活Activity的方式:


一、 显式intent,就是在代码中明确的指定要激活的组件的名称。代码如下:

<span style="font-size:18px;">Intent intent = new Intent(this ,Activity02.class );     //创建Intent对象startActivity(intent);                                  //开启Activity</span>

       在上述实例代码中,通过Intent构造方法来创建Intent对象,构造方法接收两个参数,第一个参数this,表示提供一个启动Activity的上下文;第二个参数Class则是指定要启动的目标Activity的名字,通过构造方法就可以构建一个Intent对象。


二、除了上面这种根据类名来开启组件外,显式意图还可以根据目标组件的包名、全路径来指定要开启的组件。代码如下:

<span style="font-size:18px;">intent.setClassName("cn.itcast.xxx","cn.itcast.xxx.xxxx");startActivity(intent);</span>

       通过setClassName(包名,类全路径名)函数指定要开启组件的包名和全路径名来开启这个组件。


    上述两种形式都有一个startActivity(intent)。这是Activity类中提供了一个startActivity(Intent intent)方法,用于开启Activity,它接收一个Intent参数,这里将构建好的Intent传入该方法中,即可启动目标Activity。这种开启Activity的意图很明显,因此称为显式意图。


    特点:直接激活指定的activity,效率较高。又因为里面的路径和名称都是写死了的,一般只用于本程序activity的调用。因为程序员对自己的程序是比较请清楚了,内部的包名类名,都是自己很清楚的,效率也高。


      案例应用:点击一个按钮,打开另一个Activity。

xml代码:    

<Button        android:id="@+id/btn_Open"        android:layout_centerHorizontal="true"        android:layout_centerVertical="true"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" />

MainActivity代码:

public class MainActivity extends Activity {<span style="white-space:pre"></span><span style="white-space:pre"></span>private Button btn_Open;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn_Open=(Button) findViewById(R.id.btn_Open);        //获取界面上的按钮        btn_Open.setOnClickListener(new OnClickListener(){    //给按钮添加单击事件        <span style="white-space:pre"></span>public void onClick(View v){        <span style="white-space:pre"></span>passDate();        <span style="white-space:pre"></span>}        });    }    <span style="white-space:pre"></span>public void passDate(){         <span style="white-space:pre"></span>Intent intent = new Intent(this,Activity02.class);   //显式Intent激活Activity02        <span style="white-space:pre"></span>startActivity(intent);    <span style="white-space:pre"></span>}


AndroidManifest.xml,配置清单文件代码:

<activity            android:name="com.example.helloword.MainActivity"            android:label="实验" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <activity            android:name="com.example.helloword.Activity02"            android:label="成功" >            <intent-filter>                <action android:name="android.intent.action.shiyan" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter>        </activity>


效果图:


               


隐式Intent

     

     隐式Intent,就是没有明确指定组件名称,Android系统根据隐式意图中设置的动作(action)、类别(category)、数据(Uri和数据类型)找到合适的组件。因为Android系统中每一个组件都必须在配置文件中声明,所以才有了用隐式意图来启动Activity。打开AndroidManifest.xml,找到任意一个activity,一般都能看到一段代码:

<activity            android:name="com.example.helloword.MainActivity"            android:label="实验" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.DEFAULT" />            </intent-filter> </activity>

     里面的<intent-filter>标签就是用来定义activity可以被哪些intent启动的,如果匹配,就会启动。<intent-filter>里有几个属性可以让intent来匹配:Action、Category、Data等。


     举例:根据上面的配置文件中的信息,我们用隐式意图打开这个activity ,就可以用代码:

<span style="font-size:18px;">Intent intent = new Intent();//设置动作和清单文件一样intent.setAction("android.intent.action.MAIN");startActivity(intent);</span>

    在上述代码中,Intent指定了setAction("android.intent.action.MAIN");这个动作,但是并没有指定category,这是因为清单文件张配置的“android.intent.category.DEFAULT"是一种默认的category,在调用startActivity()方法时,会自动将这个category添加到Intent中。如果不是DEFAULT的话,就需要在startActivity上面加一行代码了:

intent.addCatgory("android.intent.category.XXX");

    特点:查询系统里面满足条件的activity,再把activity激活,效率较低,比较慢。推荐用于激活别的应用程序的Activity。


    案例应用:点击一个按钮,打开另一个Activity。

    xml代码跟上面一样,就不再写了。

    MainActivity代码:

public class MainActivity extends Activity {private Button btn_Open;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btn_Open=(Button) findViewById(R.id.btn_Open);        btn_Open.setOnClickListener(new OnClickListener(){        public void onClick(View v){        Intent intent = new Intent();                intent.setAction("android.intent.action.shiyan");   //匹配action属性来激活Activity02                    startActivity(intent);        }        });    }
     

     配置清单文件代码也是跟上面的一样。

    效果图跟上面也是一样的。

总结


    利用Intent可以实现组件间的通信,上面只是演示了利用Intent来激活Activity,当然通信并不只是激活,还可以利用Intent来实现组件之间的信息提取和回传。就激活Activity来说,它的两种激活方式各有千秋,隐式Intent一般用于激活其他程序的Activity,而显式Intent一般用于激活本程序的Activity。每一个Activity都需要在清单文件AndroidManifest.xml中配置,否则不能被激活。一条<intent-filter>中没有包含任何Action类型,那么无论什么Intent请求都无法和这条<intent-filter>匹配,如果Intent请求的Action和<intent-filter>中任意一条<action>匹配,那么该Intent就可以激活该activity(前提是其它的项也通过)。如果一个activity想要通过隐式Intent方式激活,那么不能没有category设置,至少包含一个android.intent.category.DEFAULT。





1 0
原创粉丝点击