使用Intent实现活动间的跳转和数据传递

Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想哟啊执行的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动、启动服务、以及发送广播等。

Intent用法大致分为两种,显式Intent和隐式Intent。

一、显式Intent

button1.setOnClickListener(new OnClickListener() {
			
	@Override
	public void onClick(View v) {
		Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
		startActivity(intent);
	}
});

首先要构造出一个Intent对象,传入FirstActivity.this作为上下文,传入SecondActivity.class作为目标活动,我们的意图就是在FirstActivity活动的基础上启动SecondActivity目标活动,然后通过startActivity()方法来执行这个Intent。


二、隐式Intent

隐式Intent并不指明我们想要启动哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统分析找出可以响应这个隐式Intent的活动。

首先在AndroidManifest中的<activity>标签中配置<intent-filter>的内容,

<span style="white-space:pre">	</span><activity 
            android:name="com.gomez.menutest.SecondActivity">
            <intent-filter>
                <action android:name="com.gomez.menutest.ACTION_START" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
在<action>标签中指明com.gomez.menutest.ACTION_START这个action,而<category>标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category。只有<action>和<category>中的内容同时能够匹配上Intent中的action和category时,这个活动才能响应该Intent。修改按钮点击事件:

@Override
	public void onClick(View v) {
				
	 intent = new Intent(FirstActivity.this, SecondActivity.class);
//	startActivity(intent);
	Intent intent = new Intent("com.gomez.menutest.ACTION_START");
	startActivity(intent);
}
在这里没有指定category,因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category添加到Intent中。每个Intent只能指定一action,但可以指定多个category。现在我们再来增加一个category

@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
//				Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
//				startActivity(intent);
				Intent intent = new Intent("com.gomez.menutest.ACTION_START");
				intent.addCategory("com.gomez.menutest.MY_CATEGORY");
				startActivity(intent);
			}
接下来修改AndroidManifest中<activity>标签

<span style="white-space:pre">	</span><activity 
            android:name="com.gomez.menutest.SecondActivity">
            <intent-filter>
                <action android:name="com.gomez.menutest.ACTION_START" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.gomez.menutest.MY_CATEGORY" />
            </intent-filter>
        </activity>
这样SecondActivity就可以响应这个category。

三、活动间的数据传递

1、向下一个活动传递数据

在启动活动是传递数据的私立很简单,Intent提供一系列putExtra()方法重载,可以把我们想要传递的数据暂存在Intent中,启动另一个活动后,只需把这些数据再从Intent中区取出即可。比如传递一个字符串,可以这样编写代码:

<pre name="code" class="java">public void onClick(View v) {
	String data = "Hello secondActivity";
	Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
	intent.putExtra("extra_data", data);
	startActivity(intent);
}


注意这里的putExtra()方法接收两个参数,第一个参数是键,第二参数是要传递的数据。

然后我们在SecondActivity中将传递的数据取出,并打印出来

public class SecondActivity extends Activity{
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		Intent intent = getIntent();
		String data = intent.getStringExtra("extra_data");
		Log.d("SecondActivity", data);
	}
}
2、返回数据给上一个活动

修改点击事件代码:

public void onClick(View v) {
	String data = "Hello secondActivity";
	Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
	startActivityForResult(intent, 1);
}



这里我们使用startActivityForResult()方法来启动SecondActivity,第一个参数是Intent,第二个参数是请求码,用于在之后的回调中判断数据的来源,这里我们传入1就可以了。

接下来我们在SecondActivity中注册按钮事件

button2.setOnClickListener(new OnClickListener() {
			
	@Override
	public void onClick(View v) {
	Intent intent = new Intent();
		intent.putExtra("data_return", "Hello FirstActivity");
		setResult(RESULT_OK, intent);
		finish();
	}
});


注意这里的调用的setResult()方法,是专门用于向上一个活动返回数据的,第一个参数用于向上一个返回处理的结果,一般是只使用RESULT_OK或RESULT_CANCELED这两个值,第二个参数是带有数据的Intent对象。然后调用finish(),销毁当前活动,当返回上一个活动时,会回调onActivityResult()方法,因此我们要在FirstActivity中重写这个方法来得到返回的数据。

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	switch (requestCode) {
	case 1:
		if(resultCode == RESULT_OK){
			String returnData = data.getStringExtra("data_return");
			Log.d("FirstActivity", returnData);
		}
		break;

	default:
		break;
		}
	}

第一个参数是在启动活动时的请求码,第二个参数是返回数据时传入的处理结果,第三个参数是携带返回数据的Intent。

如果我们通过back键返回上一个活动我们可以通过重写onBackPressed()方法来解决,代码如下:

@Override
	public void onBackPressed() {
		Intent intent = new Intent();
		intent.putExtra("data_return", "Hello FirstActivity");
		setResult(RESULT_OK, intent);
		finish();
	}






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章