Android Intent使用

来源:互联网 发布:淘宝买二手吉他靠谱吗 编辑:程序博客网 时间:2024/05/19 22:25

在文章Android Activity活动探究中,我们介绍了如何创建一个Activity,在一个application中,只有一主活动,如何由主活动跳转到其他活动?主活动与其他活动如何进行交互?本文进行介绍,使用Intent可以实现。

1、什么是Intent

Intent是一种运行时绑定(run-time binding)机制,它能在程序运行过程中连接两个不同的组件。通过使用Intent,程序可以向Android表达某种请求或者意愿,Android会根据意愿的内容选择适当的组件来完成请求。

2、显式Intent

显式Intent指定了组件属性的Intent,通过指定具体的组件类。示例如下,我们根据文章Android Activity活动探究,继续添加如下代码。

(1)新建布局文件activity2_my.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/button2"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="myButton2" /></LinearLayout>
在该布局中添加一个按钮Button,显示名称为“myButton2”。

2)创建活动类MyActivity2.java

package com.yy.testactivity;import android.app.Activity;import android.os.Bundle;import android.view.Window;public class MyActivity2 extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//隐藏标题栏requestWindowFeature(Window.FEATURE_NO_TITLE);//加载自定义布局文件 activity2_my.xmlsetContentView(R.layout.activity2_my);}}
(3)注册活动MyActivity2

修改application配置文件AndroidManifest.xml文件,注册上述活动,如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.yy.testactivity"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="17" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <!-- register activity -->        <activity            android:name=".MyActivity"            android:label="This is MyAcitivity Label" >           <intent-filter>              <action android:name="android.intent.action.MAIN" />              <category android:name="android.intent.category.LAUNCHER" />          </intent-filter>        </activity>                <!-- register activity MyActivity2 -->        <activity android:name=".MyActivity2"     >        </activity>    </application></manifest>
MyActivity2不是主活动,不需要配置intend-filter。

(4)测试显示Intent

场景:在MyActivity中点击Button 跳转到第二个活动MyActivity2。因此修改MyActivity中按钮的点击事件,代码如下:

//监听点击事件button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {//跳转到活动MyActivity2//第一个参数:上下文,第二个参数:目标活动类Intent intent = new Intent(MyActivity.this,MyActivity2.class);//启动活动startActivity(intent);}});
(5)查看效果

重新运行程序,当点击主活动界面上的按钮时,出现如下结果:

说明已经成功启动了第二个活动了,返回主活动,按下Back键即可。

3、隐式Intent

隐式Intent指的是没有指定组件属性的Intent,需要需要根据Intent提供的信息确定是何组件。

(1)修改AndroidManifest.xml

修改第二个活动MyActivity2的配置信息,添加filter:

<!-- register activity MyActivity2 -->        <activity android:name=".MyActivity2"     >           <intent-filter>               <action android:name="com.yy.testactivity.MyActivity2.ACTION_START"/>               <category android:name="android.intent.category.DEFAULT"/>           </intent-filter>        </activity>
(2)修改MyActivity.java

修改按钮的点击事件,使用隐式Intent。代码如下:

//监听点击事件button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {//跳转到活动MyActivity2//第一个参数:上下文,第二个参数:目标活动类//Intent intent = new Intent(MyActivity.this,MyActivity2.class); //显式IntentIntent intent = new Intent("com.yy.testactivity.MyActivity2.ACTION_START");//隐式Intent//启动活动startActivity(intent);}});
在Intent的构造函数中,我们指定了想要启动的Activity,而该活动在主配置文件中MyActivity2的配置中已经进行了配置。java程序中没有指定category,就使用了配置中的默认category。

一个Intent只能配置一个Action,但能配置多个category。可以通过Intend的addCategory方法进行添加category,同时在配置文件中进行配置。

(3)结果

点击主活动按钮,同样启动了第二个活动。

4、Android内置的Action

Android内置了很多Action,比如ACTION_VIEW:数据显示,ACTION_DIAL:拨打电话等。下面是使用内置的action,当点击按钮时,跳转到百度页面。

(1)修改MyActivity.java

修改按钮点击事件,如下:

//监听点击事件button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {//跳转到活动MyActivity2//第一个参数:上下文,第二个参数:目标活动类//Intent intent = new Intent(MyActivity.this,MyActivity2.class); //显式Intent//Intent intent = new Intent("com.yy.testactivity.MyActivity2.ACTION_START");//隐式Intent//intent.addCategory("com.yy.testactivity.MY_CATEGORY");Intent intent = new Intent(Intent.ACTION_VIEW); //内置Actionintent.setData(Uri.parse("http://www.baidu.com"));//跳转到页面//启动活动startActivity(intent);}});
(2)结果

当点击主活动的按钮时,显示如下界面:

5、活动间数据传递

Intent可以在活动启动的时候进行数据传递,比如主活动可以向其他活动传递,其他活动也可以返回数据给主活动。

(1)向下一个活动传递数据

修改活动MyActivity.java中onCreate方法中按钮的点击监听事件,如下:

//监听点击事件button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {//跳转到活动MyActivity2//第一个参数:上下文,第二个参数:目标活动类Intent intent = new Intent(MyActivity.this,MyActivity2.class); //显式Intent//向活动MyActivity2传递数据intent.putExtra("info", "我来自活动1");//启动活动startActivity(intent);}});
即使用Intent的putExtra方法传递数据,其中第一个参数是key,第二个参数是value。

目标活动MyActivity2接受来自MyActivity的数据,修改MyActivity2.java,修改onCreate方法,如下:

@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//隐藏标题栏requestWindowFeature(Window.FEATURE_NO_TITLE);//加载自定义布局文件 activity2_my.xmlsetContentView(R.layout.activity2_my);//接受活动1传递来的数据Intent intent = getIntent();String info = intent.getStringExtra("info");Toast.makeText(getApplicationContext(), info, Toast.LENGTH_SHORT).show();}
         即使用Intent的getXXXExtra方法接受传递来的数据,其中XXX根据传递的数据类型进行确定的。

         当点击主活动的button时,显示如下:

                                                        

(2)返回数据给上一个活动

                 数据可以传递给下一个活动,同样可以返回给上一个活动。使用startActivityForResult方法。过程如下:

修改主活动MyActivity的方法onCreate,如下:

//监听点击事件button1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {//跳转到活动MyActivity2//第一个参数:上下文,第二个参数:目标活动类Intent intent = new Intent(MyActivity.this,MyActivity2.class); //显式Intent//向活动MyActivity2传递数据intent.putExtra("info", "我来自活动1");//启动活动//startActivity(intent);startActivityForResult(intent, 0);}});
当传递到活动MyActivity2中,修改其onCreate方法,如下:
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//隐藏标题栏requestWindowFeature(Window.FEATURE_NO_TITLE);//加载自定义布局文件 activity2_my.xmlsetContentView(R.layout.activity2_my);//接受活动1传递来的数据Intent intent = getIntent();String info = intent.getStringExtra("info");Toast.makeText(getApplicationContext(), info, Toast.LENGTH_SHORT).show();Button button2 = (Button) findViewById(R.id.button2);button2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//构建一个Intent 返还数据Intent intent2 = new Intent();intent2.putExtra("feedBack", "我来自活动2,我已经收到了你的信息,这是我给你的反馈!");setResult(RESULT_OK, intent2); //返还数据finish();//销毁当前活动}});}
即获取主活动传递来的数据,使用Toast显示,并且为Button2添加点击监听事件:创建一个Intent,回传数据给主活动,同时销毁当前活动。使用setResult方法回传数据。

需要注意的是,用户按下back时也可以返回,因此在活动MyActivity2中还需要重写onBackPressed方法,如下:

/** * 用户按钮back键返回数据 *  */@Overridepublic void onBackPressed() {//构建一个Intent 返还数据Intent intent2 = new Intent();intent2.putExtra("feedBack", "我来自活动2,我已经收到了你的信息,这是我给你的反馈!");setResult(RESULT_OK, intent2); //返还数据finish();//销毁当前活动}


当数据回传后,主活动MyActivity中需要重写方法onActivityResult进行数据的接受,重新MyActivity.java中onActivityResult方法,如下:

/** * 接受活动返回的数据,该方法对应于startActivityForResult(intent, 0)方法 * requestCode:请求码 * resultCode:返回数据时的处理结果 * data:返回数据的Intent */@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {//进行判断if(0 == requestCode && resultCode == RESULT_OK){//获取数据String feedBack = data.getStringExtra("feedBack");Toast.makeText(getApplicationContext(), feedBack, Toast.LENGTH_SHORT).show();}}
这样就完成了整个传递及回传过程。

测试:向下传递数据我们上面已经测试过,在这里我们测试回传数据,当点击活动MyActivity2中的按钮时,显示如下:
                                                       

说明主活动MyActivity获取到了返还数据。

总结:本文介绍了Intent的使用,比如在活动中调用方式、活动间的数据传递等内容。



1 0
原创粉丝点击