Android一个特别重要的特点就是可以基于一个“action”就能发送用户到其他app界面上。例如,如果你的应用程序有一个商务地址你想要显示在地图上,你不必要在你的app中构建一个展示地图的Activity。相反的,你可以使用一个Intent创建一个地址的展示请求。Android系统就会启动一个可以展示那个地址的地图的app了。我们必须使用Intent来导航切换app中不同的Activity。这个小章节用来展示如何为一个特定的动作创建一个隐式Intent,如何使用它来启动一个在其他app中完成动作的Activity。
构建一个隐式的Intent
隐式的Intent没有声明组件要启动的类名,但是相反的它声明的是一个要完成的动作。这个动作就是我们想要做的事,比如:视图展示,编辑,发送或者是获得某些东西。
下面是打电话:
Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);接着调用startActivity()即可。
展示地图:
// 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);最后都是要调用startActivity() 方法或者是startActivityForResult()发送Email:
Intent emailIntent = new Intent(Intent.ACTION_SEND);
// The intent does not have a URI, so declare the "text/plain" MIME type
emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
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创建一个日历事件:支持版本14以上
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的App是否存在
如果我们调用一个Intent,但是手机设备中没有那个对应的App可以处理这个特定的Intent,我们的App就会崩溃
为了验证是否有可以响应intent的Activity存在,我们要调用queryIntentActivities()来获得一个可以处理Intent的集合。如果我们的集合返回是空的话,我们就可以安全的使用Intent 了。例如:
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = activities.size() > 0;如果isIntentSafe值为true的话,至少会有一个App可以响应我们的Intent,如果是false的话,那么就不会有响应我们Intent的App了。
用Intent启动一个Activity
本例子是展示怎么创建一个展示地图的Intent,验证如果有处理Intent的App的话,就启动这个App
// 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);
}显示一个App选择器
有时候如果有很多的app都能处理那个Intent的话,就会显示出一个对话框,让我们选择要选用哪个作为默认的,以后就是使用那个默认的了。但是,如果我们想要用户每次都自己选择不同的App的话,可以定义一个选择器,它每次都是展现一个列表对话框,供用户选择。
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 and start the chooser
Intent chooser = Intent.createChooser(intent, title);
startActivity(chooser);
本文介绍如何在Android应用中使用Intent来实现跨应用的功能调用,包括拨打号码、展示地图、发送邮件等操作,并展示了如何验证目标应用的存在及通过选择器让用户挑选应用。

被折叠的 条评论
为什么被折叠?



