Intent 的用法大致可以分为两种,显式 Intent 和隐式 Intent。
使用显式Intent
1)Intent有多个构造函数的重载,其中一个是 Intent(Context packageContext, Class<?> cls)。这个构造函数接收两个参数,第一个参数 Context 要求提供一个启动活动的上下文,第二个参数 Class 则是指定想要启动的目标活动, 通过这个构造函数就可以构建出 Intent 的 “意图” 。
2)Activity 类中提供了一个 startActivity()方法, 这个方法专门用于启动活动。
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。
<activity android:name=".SecondActivity" > <intent-filter> <action android:name="com.example.activitytest.ACTION_START" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
只有<action>和<category>中的内容同时能够匹配上 Intent 中指定的 action 和 category 时,这个活动才能响应该 Intent。
button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.activitytest.ACTION_START"); startActivity(intent); } });
intent.addCategory("com.example.activitytest.MY_CATEGORY");
这使得 Android 多个应用程序之间的功能共享成为了可能。
比如说你的应用程序中需要展示一个网页,这时你没有必要自己去实现一个浏览器(事实上也不太可能) ,而是只需要调用系统的浏览器来打开这个网页就行了。
修改 FirstActivity 中按钮点击事件的代码,如下所示:button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.baidu.com")); startActivity(intent); } });我们还可以在<intent-filter>标签中再配置一个<data>标签,用于更精确地指
5. android:mimeType
用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只有<data>标签中指定的内容和 Intent 中携带的 Data完全一致时, 当前活动才能够响应该 Intent。
除了 http 协议外,我们还可以指定很多其他协议,比如 geo 表示显示地理位置、tel 表示
拨打电话。下面的代码展示了如何在我们的程序中调用系统拨号界面。button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:10086")); startActivity(intent); } });
接下来我们谈谈使用Intent在活动中进行数据传递
向下一个活动传递数据
在启动活动时传递数据的思路很简单,Intent中提供了一系列 putExtra()方法的重载,可以把我们想要传递的数据暂存在 Intent 中,启动了另一个活动后,只需要把这些数据再从Intent 中取出就可以了。
比如说 FirstActivity 中有一个字符串,现在想把这个字符串传递到SecondActivity 中,你就可以这样编写:
button1.setOnClickListener(new OnClickListener() { @Override 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) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.second_layout); Intent intent = getIntent(); String data = intent.getStringExtra("extra_data"); Log.d("SecondActivity", data); } }首先可以通过 getIntent()方法获取到用于启动 SecondActivity 的 Intent,然后调用getStringExtra()方法,传入相应的键值,就可以得到传递的数据了。这里由于我们传递的是字符串,所以使用 getStringExtra()方法来获取传递的数据,如果传递的是整型数据,则使用getIntExtra()方法,传递的是布尔型数据,则使用 getBooleanExtra()方法,以此类推。
修改 FirstActivity 中按钮的点击事件,代码如下所示:
button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivityForResult(intent, 1); } });
接下来我们在 SecondActivity 中给按钮注册点击事件,并在点击事件中添加返回数据的逻辑,代码如下所示:
public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.second_layout); Button button2 = (Button) findViewById(R.id.button_2); 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()是专门用于向上一个活动返回数据的。setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般只使用 RESULT_OK 或RESULT_CANCELED 这两个值,第二个参数则是把带有数据的 Intent 传递回去,然后调用了 finish()方法来销毁当前活动。
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case 1: if (resultCode == RESULT_OK) { String returnedData = data.getStringExtra("data_return"); Log.d("FirstActivity", returnedData); } break; default: } }onActivityResult()方法带有三个参数,第一个参数 requestCode,即我们在启动活动时传入的请求码。 第二个参数 resultCode, 即我们在返回数据时传入的处理结果。 第三个参数 data,即携带着返回数据的 Intent。由于在一个活动中有可能调用 startActivityForResult()方法去启动很多不同的活动,每一个活动返回的数据都会回调onActivityResult()这个方法中,因此我们首先要做的就是通过检查 requestCode 的值来判断数据来源。确定数据是从SecondActivity 返回的之后,我们再通过 resultCode 的值来判断处理结果是否成功。最后从data中取值并打印出来,这样就完成了向上一个活动返回数据的工作。
@Override public void onBackPressed() { Intent intent = new Intent(); intent.putExtra("data_return", "Hello FirstActivity"); setResult(RESULT_OK, intent); finish(); }