Intent——移动程序开发中两个界面连接的桥梁
Intend的介绍
Intent 在英语里有意图,意向,专注的意思,我觉得用他的英语含义理解他的功能在合适不过了,他的功能就是协助应用间的交互与通讯或者是一个应用中的Activity(或Service)之间的交互。简单来说它就像一个桥梁,连接着不同的界面。要是你需要在两个界面之间相互转换,那你肯定需要他了。
如下图所示,两个Activity分别是自动点餐和结算单,当单击“下单”按钮时,通过Intent将数据发送给结算单,同时页面跳转到结算单界面。
在Android系统的四个核心组件中,除了Contentprovider以外,其他三个核心组件(Activity、Service、Broadcast receiver)实际上都是被一个叫做Intent的异步消息来激活的。激活的组件可以是Android系统自身提供的,也以是开发者自定义的,其激活方式有显式Intent和隐式Intent两种:
(1)显式Intent:通过指定目标组件名称来启动组件,并且每次启动的组件只能有一个。一般情况下由于开发者不知道其他应用程序的组件名称,所以显式Intent通常用于启动应用程序内部组件;
(2)隐式Intent:不指定要启动的目标组件名称,而是指定Intent的Action、Data或Category等,通常用隐式Intent激活其他应用程序中的组件;在启动组件时,会去匹配AndroidManifest.xml相关组件的Intent-filter,并逐一匹配出满足属性的组件,当不止一个满足时就会弹出一个让用户选择动哪个目标组件的对话框。
显式Intent启动Activity
显式Intent即直接指定需要打开的Activity对应类。下面以单击Button按钮实现AActivity跳转到BActivity为例说明显式Intent的使用方法。如图,通过单击启动按钮,实现由A启动B。下面简单介绍一下。
首先先建个Activity,建立方法如下:
AActivity和对应的xml文件的代码:
下面展示 AActivity对应代码
。这个代码其实很简单,只有一个Button的监听事件和Intent调用
package experiment.studyintent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class AActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.amain);
btn= (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(AActivity.this,BActivity.class);//Intent括号里面的参数用法有很多,
// 这里我们只是从一个界面启动另一个界面,直接填如两个Activity即可
startActivity(intent);//启动,其实Intent就像一个运输车辆,里面是可以装内容的
}
});
}
}
下面展示 AActivity对应的xml文件代码
。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:hint="启动BActivity"
android:id="@+id/btn"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
BActivity的代码什么也没有,只有对应的xml文件有一个TextView写着BActivity,所以就不展示了,直接展示结果:在A中点击启动按钮就会跳转到B,点击返回就回到A。
注意:
1.如果要指定某一个Activity作为启动界面,那么必须在配置文件(AndroidManifest.xml)中放入intend-filter,另外每一个Activity文件都必须在配置文件中进行声明。
2.两个Activity需要有统一的style,否则可能会报错。
显式intent的数据传输
步骤:
1.在AActivity中存入数据
2.在BActivity中取出数据
3.如果需要一次传输多个数据,那么需要借助bundle来实现
AActivity:
String sname = edt.getText().toString();
Intent intent = new Intent(AActivity.this, BActivity.class);//Intent括号里面的参数用法有很多,
// 这里我们只是从一个界面启动另一个界面,直接填如两个Activity即可
intent.putExtra("sanme", sname);
startActivity(intent);//启动,其实Intent就像一个运输车辆,里面是可以装内容的
BActivity:
tv= (TextView) this.findViewById(R.id.tv);
Intent intent = getIntent();
String sname = intent.getStringExtra("sname");
tv.setText(sname);
即实现了在A中输入的字符串发送给B。
隐式Intent启动Activity
隐式Intent启动Activity:
隐式启动Activity是指Android系统根据过滤规则自动去匹配对应的Intent。
首先修改配置清单文件代码,添加BActivity的intent-filter属性,并且category属性值设置为“android.intent.category.DEFAULT",详细代码如下:
<activity android:name=".BActivity">
<intent-filter>
<action android:name="cn.edu.nnutc.ie.MYACTION" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
然后在AActivity的Button单击监听事件中设置Intent发送的Action(动作)为“cn.edu.nnutc.ie.MYACTION",这样与清单文件中配置的BActivity的Action能进行匹配。实现代码如下:
Intent intent = new Intent();
intent.setAction("cn.edu.nnutc.ie.MYACTION");
startActivity(intent);
Intent还可直接调用android系统组件
// 调用浏览器
Uri webViewUri = Uri.parse("http://blog.csdn.net/zuolongsnail");
Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri);
// 调用地图
Uri mapUri = Uri.parse("geo:100,100");
Intent intent = new Intent(Intent.ACTION_VIEW, mapUri);
// 播放mp3
Uri playUri = Uri.parse("file:///sdcard/test.mp3");
Intent intent = new Intent(Intent.ACTION_VIEW, playUri);
intent.setDataAndType(playUri, "audio/mp3");
// 调用拨打电话
Uri dialUri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_DIAL, dialUri);
// 直接拨打电话,需要加上权限<uses-permission id="android.permission.CALL_PHONE" />
Uri callUri = Uri.parse("tel:10086");
Intent intent = new Intent(Intent.ACTION_CALL, callUri);
// 调用发邮件(这里要事先配置好的系统Email,否则是调不出发邮件界面的)
Uri emailUri = Uri.parse("mailto:zuolongsnail@163.com");
Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);
// 直接发邮件
Intent intent = new Intent(Intent.ACTION_SEND);
String[] tos = { "zuolongsnail@gmail.com" };
String[] ccs = { "zuolongsnail@163.com" };
intent.putExtra(Intent.EXTRA_EMAIL, tos);
intent.putExtra(Intent.EXTRA_CC, ccs);
intent.putExtra(Intent.EXTRA_TEXT, "the email text");
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.setType("text/plain");
Intent.createChooser(intent, "Choose Email Client");
// 发短信
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.putExtra("sms_body", "the sms text");
intent.setType("vnd.android-dir/mms-sms");
// 直接发短信
Uri smsToUri = Uri.parse("smsto:10086");
Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);
intent.putExtra("sms_body", "the sms text");
// 发彩信
Uri mmsUri = Uri.parse("content://media/external/images/media/23");
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra("sms_body", "the sms text");
intent.putExtra(Intent.EXTRA_STREAM, mmsUri);
intent.setType("image/png");
// 卸载应用
Uri uninstallUri = Uri.fromParts("package", "com.app.test", null);
Intent intent = new Intent(Intent.ACTION_DELETE, uninstallUri);
// 安装应用
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.apk"), "application/vnd.android.package-archive");
// 在Android Market中查找应用
Uri uri = Uri.parse("market://search?q=淘宝");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);