如何判断是否可以使用某个Intent

Android提供了一个称为Intent的强大易用的工具,Intent可以将应用转化为高等组件来使用并能比以前更好地重用代码。例如Android主屏幕和AnyCut广泛地使用Intent来创建快捷方式。虽然这种松耦合的API使用起来非常方便,但并不能保证你所发送的Intent一定会被另一个应用接收,这种情况会发生在某些特定的第三方应用程序,如Panoramio及它的RADAR Intent。

在开发一个新应用程序的时候,我想到了一个非常简单的方法来判断系统是否包含某个应用程序可以响应我想要使用的Intent。用户一般通过点击菜单来触发某个Intent,我实现了上述方法,如果某个系统无法响应某个Intent,我会把菜单置灰。实现代码是非常简单和易于遵循的,具体如下:

/**

* Indicates whether the specified action can be used as an intent. This

* method queries the package manager for installed packages that can

* respond to an intent with the specified action. If no suitable package is

* found, this method returns false.

*

* @param context The application‘s environment.

* @param action The Intent action to check for availability.

*

* @return True if an Intent with the specified action can be sent and

*         responded to, false otherwise.

*/

public static boolean isIntentAvailable(Context context, String action) {

final PackageManager packageManager = context.getPackageManager();

final Intent intent = new Intent(action);

List<ResolveInfo> list =

packageManager.queryIntentActivities(intent,

PackageManager.MATCH_DEFAULT_ONLY);

return list.size() > 0;

}

下面是具体的使用方法:

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

final boolean scanAvailable = isIntentAvailable(this,

"com.google.zxing.client.android.SCAN");

MenuItem item;

item = menu.findItem(R.id.menu_item_add);

item.setEnabled(scanAvailable);

return super.onPrepareOptionsMenu(menu);

}

在这个例子中,如果手机中没有安装条码扫描应用,那么该菜单会被置灰。另一种简单的处理方法是在调用startActivity()后捕捉ActivityNotFoundException异常,但是这种方式只能是在问题发生后被动地响应,而不能预先判断,假如某个Intent不能被接收的话,就事先更改UI(如置灰)来阻止用户操作。这里介绍的方法也可以在启动时询问用户是否愿意安装所缺少的应用包,你也可以通过使用适当的URI方便地将用户引导到Android市场去下载应用。

说明:这篇文章最初发表在我的个人博客(http://www.curious-creature.com/2008/12/15/android-can-i-use-this-intent/)上。

原文地址:http://android-developers.blogspot.com.tr/2009/01/can-i-use-this-intent.html

时间: 2024-08-30 15:57:27

如何判断是否可以使用某个Intent的相关文章

通过讨论Oracle 中sql语句的执行顺序,判断哪里可以使用定义过的别名

查询语句的执行顺序: select ename as name from scott.emp emp where emp.job=' CLERK' order by name 1.先执行from 确定数据来自哪里 2.再执行where 条件 判断符合条件的数据,可以使用表scoot.emp 的别名emp 3.执行select 查询 查询数据 4.最后执行 order by 对查出来的数据排序,所以order by后可以使用字段eame的别名name 原文地址:http://blog.51cto.

Android中常见Intent习惯用法-上篇(附源码下载)

Android中的Intent是一个非常重要的类,如果对Intent不是特别了解,可以参见博文<Android中Intent概述及使用>.如果对Intent Filter不是特别了解,可以参见博文<Android中Intent对象与Intent Filter过滤匹配过程详解>. 本文着重讲一下Android中一些常见的Intent的习惯用法,比如如何通过Intent发送短信.发送邮件.启动摄像机拍照录视频.设置闹铃.打开WIFI设置界面等等. 限于篇幅,本博文分为上下两篇,这是上篇

Intent 意图 用于Activity之间的数据传递

转自:http://blog.sina.com.cn/s/blog_83940dfb0100veas.html 用于Activity之间的数据传递 在起始Activity中,发送数据 protected void onCreate(Bundle saveInstanceState){ super.onCreate(saveInstanceState); setContentView(R.layout.thisactivity); Intent intent = new Intent(); //设

intent中的请求码与结果码

在Android中,当Activity之间相互跳转时,可以使用意图(Intent)来传递相应的数据. 新的Activity与主Activity不在同一个线程中,当新的Activity关闭时,会触发主Activity的onActivityResult事件. startActivityForResult(Intent intent, int requestCode): 主Activity带着请求码跳到一个新的Activity界面. onActivityResult(int requestCode,

转-Activity之间数据传递之Intent数据传递

Intent意图 可用于Activity之间的数据传递,一般可分为下面两种情况,从当前Activity传递到目标Activity后有无返回值: 1.传递后无返回值的情况: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50    在起始Activity中,发送数据   

Pro Android学习笔记(十一):了解Intent(中)

Intent的构成 Intent可以带有action,data(由URI表达),extra data(key/value map,键值对),指定的类名(成为component name).一个intent至少携带上述的一个内容. Action.Action名,在上一笔记中已经给出两种例子,一种是系统自带的,如Intent.ACTION_DAIL,一种是开发者通过AndroidManifest.xml进行注册的,在创建intent时给出:Intent intent=new Intent(Strin

A Round Peg in a Ground Hole - POJ 1584 (判断凸多边形&amp;判断点在多边形内&amp;判断圆在多边形内)

题目大意:首先给一个圆的半径和圆心,然后给一个多边形的所有点(多边形按照顺时针或者逆时针给的),求,这个多边形是否是凸多边形,如果是凸多边形在判断这个圆是否在这个凸多边形内. 分析:判断凸多边形可以使用相邻的三个点叉积判断,因为不知道顺时针还是逆时针,所以叉积如果有有整数和负数,那么一定不是凸多边形(注意允许多多点在一条线段上).判断圆在凸多边形首先要判断圆心是否在多边形内,如果在多边形内,再次判断圆心到达到变形每条边的最短距离,如果小于半径就是不合法.ps:一道好题,通过这个题学会了不少东西.

Struts标签,jstl标签等判断字符串包含

判断某值是否包含指定的字符串的几种写法. 1.jstl标签写法, 主要使用的是 fn,使用的时候,需要引入 <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> <c:choose> <c:when test="${fn:contains(item.name,'全能')}"> <strong> <font 

【转】Pro Android学习笔记(十一):了解Intent(中)

Intent的构成 Intent可以带有action,data(由URI表达),extra data(key/value map,键值对),指定的类名(成为component name).一个intent至少携带上述的一个内容. Action.Action名,在上一笔记中已经给出两种例子,一种是系统自带的,如Intent.ACTION_DAIL,一种是开发者通过AndroidManifest.xml进行注册的,在创建intent时给出:Intent intent=new Intent(Strin