Android Intent使用

在文章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的使用,比如在活动中调用方式、活动间的数据传递等内容。



  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值