Android 系统有一个特性就是可以让用户从一个app进入另一个app,在一个app里点击一个号码就可以进入拨号界面。
实现这个功能一般用的是隐式intent
隐式intent不会声明启动的类名,仅仅声明一个你需要执行的action。
Action指定了你想要做的事,例如发送短信,进入地图界面,分享功能。
Action指定你做的事情类型,你可以通过uri去得到具体的数据。
Intent提供一种构造方法:
如下面例子:初始化一个打电话的,uri则是指定电话号码。
Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
调用startActivity(intent)就可以实现打电话的功能。
查看一个地图:
// Map point based on address
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
// Or map point based on latitude/longitude
// Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
打开一个网页
Uri webpage = Uri.parse("http://www.android.com");
Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
隐式intent还有一个extra data 可以设置不同的数据类型,你可以通过putExtra方法添加不同的信息,你没有给intent提供uri数据类型,你也可以通过intent的setType方法设置一个类型。设置MIME类型进一步指定那种activity应该接受这个intent
(MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。)
(URI百度解释:在电脑术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。
Web上可用的每种资源 -HTML文档、图像、视频片段、程序等 - 由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位。
)
发送邮件功能实现:
Intent emailIntent = new Intent(Intent.ACTION_SEND);//没有指定uri
// The intent does not have a URI, so declare the "text/plain" MIME type
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);//设置了一个 text/plain类型
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
// You can also attach multiple items by passing an ArrayList of Uris
创建一个日历事件
Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
calendarIntent.putExtra(Events.TITLE, "Ninja class");
calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
这个日历事件intent支持api 14以上
如果你想查看照片使用Intent.ACTION_VIEW 你应该指定image/* 这种MIME类型。
注意:如果你调用Intent 去打开另一个应用,但是设备上没有app 可以处理你定义的intent,你的程序就会闪退。
所以你应该查看是否有Activity是否可以处理你的intent,如果返回的activity列表非空,你就可以正常使用intent了。
PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
如果针对你的intent有多个activity匹配,就会弹出一个对话框让你选择哪一个app处理。
如果只有一个就会立即打开应用。
下面是一个完整的例子,正确使用intent打开地图功能。
// Build the intent
Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
// Verify it resolves
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
boolean isIntentSafe = activities.size() > 0;
// Start an activity if it's safe
if (isIntentSafe) {
startActivity(mapIntent);
}
你通过startActvity 默认打开intent 如果有多个应用匹配就会弹出选择对话框:
并且默认可以 设置你默认打开的checkbox 。
有时候用户点了默认,又想选择另一个应用,这样有另一种方式处理。
Intent intent = new Intent(Intent.ACTION_SEND);
...
// Always use string resources for UI text.
// This says something like "Share this photo with"
String title = getResources().getString(R.string.chooser_title);
// Create intent to show chooser
Intent chooser = Intent.createChooser(intent, title);
// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(chooser);
}
利用intent 创建选择对话框,可以让用户每次都可以选择,没有默认checkbox