您的位置:首页 > 移动开发

和其他App交互(1)发送用户到其他App界面

2015-01-05 09:38 253 查看
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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: