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

来源:互联网 发布:导师睡研究生知乎 编辑:程序博客网 时间:2024/05/20 22:28

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 addressUri 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 levelIntent 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 typeemailIntent.setType(HTTP.PLAIN_TEXT_TYPE);emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipientsemailIntent.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 intentUri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);// Verify it resolvesPackageManager packageManager = getPackageManager();List<ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);boolean isIntentSafe = activities.size() > 0;// Start an activity if it's safeif (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 chooserIntent chooser = Intent.createChooser(intent, title);startActivity(chooser);









0 0