Android:将用户带到另外一个应用程序
2012-06-28 19:27
232 查看
把用户带到另外一个应用程序
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
4000
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就会崩溃掉。
调用
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()并将其传递给
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.
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
4000
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.
相关文章推荐
- Android---把用户带入另外一个应用程序(二)
- Android---把用户带入另外一个应用程序(一)
- Android基础---把用户带入另外一个应用程序(一)
- Android基础---把用户带入另外一个应用程序(二)
- Android---把内容发送给另外一个应用程序
- Android:在一个应用程序中启动另外一个已经安装的应用程序或系统程序
- android 通过包名 启动另外一个android应用程序
- Android Training - 和其他程序交互(1) - 发送用户请求给另外一个程序
- android中一个应用程序启动另外一个应用程序,并传递数据。
- Android - 在一个应用程序中启动另外一个已经安装的应用程序或系统程序
- android中一个程序中再次开启另外一个应用程序
- android中一个程序中再次开启另外一个应用程序
- Android基础---把内容发送给另外一个应用程序
- java应用程序中判断用户输入的一个整数是否在已知数组里。
- Android应用启动另外一个apk应用的方法
- Android 实现在Activity中操作刷新另外一个Activity数据列表
- Android在开机时自动启动一个应用程序
- 启动另外的一个应用程序的Activity(三种方式)
- Android--一个好玩的应用程序/开机自启动
- IOS开发中,在一个应用程序中启动另外一个应用