您的位置:首页 > 其它

利用intent打开另一个应用的功能

2016-01-03 02:07 423 查看
   Android 系统有一个特性就是可以让用户从一个app进入另一个app,在一个app里点击一个号码就可以进入拨号界面。

实现这个功能一般用的是隐式intent

隐式intent不会声明启动的类名,仅仅声明一个你需要执行的action。

Action指定了你想要做的事,例如发送短信,进入地图界面,分享功能。

Action指定你做的事情类型,你可以通过uri去得到具体的数据。

 

Intent提供一种构造方法:

如下面例子:初始化一个打电话的,uri则是指定电话号码。

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
 

调用startActivity(intent)就可以实现打电话的功能。

 

查看一个地图:

// 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还有一个extra data 可以设置不同的数据类型,你可以通过putExtra方法添加不同的信息,你没有给intent提供uri数据类型,你也可以通过intent的setType方法设置一个类型。设置MIME类型进一步指定那种activity应该接受这个intent

(MIME类型就是设定某种扩展名文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义文件名,以及一些媒体文件打开方式。)

(URI百度解释:在电脑术语中,统一资源标识符(Uniform Resource Identifier,或URI)是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本地和互联网)的资源通过特定的协议进行交互操作。URI由包括确定语法和相关协议的方案所定义。

Web上可用的每种资源 -HTML文档、图像、视频片段、程序等 - 由一个通用资源标识符(Uniform Resource Identifier, 简称"URI")进行定位。



发送邮件功能实现:

Intent emailIntent = new Intent(Intent.ACTION_SEND);//没有指定uri
// The intent does not have a URI, so declare the "text/plain" MIME type

emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);//设置了一个 text/plain类型

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
 

 

创建一个日历事件

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 你应该指定image/* 这种MIME类型。

 

注意:如果你调用Intent 去打开另一个应用,但是设备上没有app 可以处理你定义的intent,你的程序就会闪退。

 

所以你应该查看是否有Activity是否可以处理你的intent,如果返回的activity列表非空,你就可以正常使用intent了。

PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent,

        PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
 

如果针对你的intent有多个activity匹配,就会弹出一个对话框让你选择哪一个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);
}
 你通过startActvity 默认打开intent 如果有多个应用匹配就会弹出选择对话框:



 

并且默认可以 设置你默认打开的checkbox 。

有时候用户点了默认,又想选择另一个应用,这样有另一种方式处理。

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 intent to show chooser
Intent chooser = Intent.createChooser(intent, title);

// Verify the intent will resolve to at least one activity
if (intent.resolveActivity(getPackageManager()) != null) {

    startActivity(chooser);
}
利用intent 创建选择对话框,可以让用户每次都可以选择,没有默认checkbox

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: