在文章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 { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); //加载自定义布局文件 activity2_my.xml setContentView(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() { @Override public 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() { @Override public 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 //启动活动 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() { @Override public 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); //内置Action intent.setData(Uri.parse("http://www.baidu.com"));//跳转到页面 //启动活动 startActivity(intent); } });(2)结果
当点击主活动的按钮时,显示如下界面:
5、活动间数据传递
Intent可以在活动启动的时候进行数据传递,比如主活动可以向其他活动传递,其他活动也可以返回数据给主活动。
(1)向下一个活动传递数据
修改活动MyActivity.java中onCreate方法中按钮的点击监听事件,如下:
//监听点击事件 button1.setOnClickListener(new OnClickListener() { @Override public 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方法,如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); //加载自定义布局文件 activity2_my.xml setContentView(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() { @Override public 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方法,如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //隐藏标题栏 requestWindowFeature(Window.FEATURE_NO_TITLE); //加载自定义布局文件 activity2_my.xml setContentView(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() { @Override public 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键返回数据 * */ @Override public 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 */ @Override protected 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的使用,比如在活动中调用方式、活动间的数据传递等内容。