4.1使用Intent打开网页,电话号码或任何其他内容
问题
你想要一个应用程序有一些实体由另一个应用程序处理,而不知道或关心什么是其他应用程序。
解
调用Intent构造函数;然后在构造的Intent上调用startActivity。
讨论
Intent构造函数接受两个参数:要执行的操作和要执行的实体。想想第一个作为动词,第二个作为动词的对象。最常见的操作是Intent.ACTION_VIEW,其中的字符串表示形式是android.intent.action.VIEW。第二个通常是URL或在Android中的URI(通用资源标识符)。 URI对象可以使用Uri类中的静态parse()方法创建(注意类名称中的两个小写字母,即使它是一个首字母缩写词,不要使用java.net中的URI类)。假设字符串变量数据包含我们想要查看的位置,为其创建Intent的代码可能如下所示:
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(data));
就这样! Android的优点如下所示:我们不知道或不在乎数据是否包含http:,一个电话号码为tel:的网页网址,或者我们从未见过的内容。只要有一个应用程序注册来处理这种类型的意图,Android将为我们找到它,在我们调用它。我们如何调用意图?
记住,Android将启动一个新的活动来运行意图。假设代码在一个活动中,只需调用继承的startIntent方法,例如:
startActivity(intent);
如果一切顺利,用户将看到Web浏览器,电话拨号器,地图应用程序或任何。
Google定义了许多其他操作,例如ACTION_OPEN(尝试打开命名对象)。在一些情况下,VIEW和OPEN将具有相同的效果,但是在其他情况下,前者可以显示数据,并且后者可以允许用户编辑或更新数据。
如果请求失败,因为您的特定设备在其所有可以处理此特定Intent的所有应用程序中没有单个活动,用户将不会看到另一个活动,而是startActivity()调用将抛出未检查的ActivityNotFoundException。
即使事情行得通,我们也不会知道。这是因为我们基本上告诉Android,我们不关心意图是成功还是失败。要获得反馈,我们将调用startActivityForResult():
startActivityForResult(intent,requestCode);
requestCode是用于跟踪多个Intent请求的任意数字;你通常应该为每个开始的Intent选择一个唯一的编号,并跟踪这些数字以跟踪结果(如果你只有一个Intent的结果你关心,只是使用数字1)。
只是做这个更改将没有效果,但是,除非我们也重写一个重要的方法在Activity,也就是:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// do something with the results...
}
这可能是显而易见的,但重要的是要注意,你不能知道Intent的结果,直到正在处理它的Activity被完成,这可能是任意时间后。然而,onActivityResult最终将被调用。
resultCode当然用于指示成功或失败。它们有定义的常量,特别是Activity.RESULT_OK和Activity.RESULT_CANCELED。
一些Intent提供自己的,更具体的结果代码;例如。
有关使用传递的意图的信息,请参阅传递额外数据的食谱。
附加到此配方的示例程序允许您键入URL,并使用上面定义的操作打开或查看它。您可能尝试的一些示例URL显示在下表中:
URL Meaning Note
http://www.google.com/ Web page
content://contacts/people/ List of contacts
content://contacts/people/1 Contact details for one person
geo:50.123,7.1434?z=10 Location and zoom Need Google API
geo:39.0997,-94.5783 Location Need Google API