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