Android:将用户带到另外一个应用程序

把用户带到另外一个应用程序

       Android最重要的特点就是,基于用户不同的动作,它能把用户带到另外一个应用程序。例如:如果你的APP 有一个商业地址需要在地图上显示,你不用在自己的APP中新建一个活动来显示这个地图,相反,你可以通过intent来发送查看这个地址的请求。Android系统会自动启动一个能在地图上查看这个地址的APP.

       我们知道,当你需要启动本应用中其它的活动时,你能够通过一个显示的intent,然后指定需要被启动的组件类名。然后,当需要被启动的组件在另外一个APP中时,你就必须使用一个隐式的intent.

       这篇文章主要讲的就是如果为一个特定的action创建一个隐式的intent,以及如何利用它来启动其它APP中的活动来执行这个action.

 

创建一个隐式的intent

       隐式的intent不会指定要启动的组件类名,相反,它定义一个action 来执行。这个action指定了你要做的事情,例如:查看,编辑,发送,获得等等。跟这个action想关联的包括一个数据,例如你要查看的地址,你要发送的邮件类容,取决于你要创建的intent,数据可能是一个Uri,或者其它数据类型,也可能没有数据。

如下是一些定义隐式intent的例子

第一个是拨打电话的隐式intent:

Uri  number = Uri.parse(“tel:5551234”);

Intent  callIntent  = new Intent(Intent.ACTION_DIAL,number);

当你的APP 通过startActivity()来唤起这个intent时,电话APP就会给指定的号码打电话。

 

第二个是查看地图:

// 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 需要额外数据,例如字符串。不能够通过不同putExtra()方法来添加多个额外数据。

       通常情况下,系统会根据intent所包含的Uri数据来决定intent的MIME类型。如果你的intent中没有U ri,你应该通过setType()来指定跟这个intent相关的数据类型。设定MIME 类型进一步指定哪些活动应该接收这个intent.

 

如下是一些添加了额外数据的intent,来指定期望的action.

 

发送一个包含附件的邮件:

Intent emailIntent =newIntent(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,newString[]{"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,同时,你还应该指定MIME 类型为image/*.这样才能阻止能查看其它数据类型的APP触发(例如地图APP).

 

查证至少有一个APP能接收这个intent

       尽管Android平台保证一些intents可以有系统内置的APP去响应(例如电话,邮件,日历等),你还是应该在调用一个intent之前验证下。

警告:如果你调用一个intent之后,设备上没有APP能够处理intent,你的APP就会崩溃掉。

       调用queryIntentActivities()就能够得到所有能响应这个intent的活动。如果返回的List不为空,,你就能安全使用这个intent.

例子:

PackageManager packageManager = getPackageManager();

List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);

boolean isIntentSafe = activities.size() > 0;

 

如果isIntentSafe为真的话,表示至少有一个APP能响应这个intent.如果为假表示没有任何APP能响应这个intent.

 

注意:你应该在你的活动第一次start时进行这个验证。因为在用户尝试使用它之前,你要让使用这个intent的功能不可用。如果你知道某个APP能处理这个intent,你也可以一个链接让用户去下载这个APP.(详见如果让你的设备链接到Google Play).

 

使用Intent启动一个活动

       一旦你创建了一个intent,并包含额外数据,然后调用startActivity()把它传递给系统。如果系统找到多余一个活动能处理这个intent的时候,系统会弹出一个列表来供用户选择启动哪个。如果只有一个活动,那么系统就直接启动它。

startActivity(intent);

如下是一个完整的例子,它通过一个intent来显示地图,验证有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);

}

 

显示一个APP选择器

       当一个Intent有多个APP可以响应的时候,系统会弹出一个对话框给用户选择。对话框的底部有一个设置为默认的选项,当勾选了这个以后,每次都会启动同一个APP(不用用户选择)。但是某些时候,可能用户每次需要选择的APP都不一样,例如分享的时候,这时候就应该创建一个每次都需要选择,不提供默认的APP对话框。

       为了显示这种选择框,使用Intent.createChooser()并将其传递给startActivity()

例子:

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().getText(R.string.chooser_title);

// Create and start the chooser

Intent chooser = Intent.createChooser(intent, title);

startActivity(chooser);

这样就能创建一个对话框了,对话框里面的APP是能够处理传递给createChooser()的intent的APP.对话框的标题 传递给它的title.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值