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); }接下来修改 AndroidM anifest中<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); }
然后我们在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); }
接下来我们在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(); } });
@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; } }
如果我们通过back键返回上一个活动我们可以通过重写onBackPressed()方法来解决,代码如下:
@Override public void onBackPressed() { Intent intent = new Intent(); intent.putExtra("data_return", "Hello FirstActivity"); setResult(RESULT_OK, intent); finish(); }