如何判断是否可以使用某个Intent
Android提供了一个称为Intent的强大易用的工具,Intent可以将应用转化为高等组件来使用并能比以前更好地重用代码。例如Android主屏幕和AnyCut广泛地使用Intent来创建快捷方式。虽然这种松耦合的API使用起来非常方便,但并不能保证你所发送的Intent一定会被另一个应用接收,这种情况会发生在某些特定的第三方应用程序,如Panoramio及它的RADARIntent。
在开发一个新应用程序的时候,我想到了一个非常简单的方法来判断系统是否包含某个应用程序可以响应我想要使用的Intent。用户一般通过点击菜单来触发某个Intent,我实现了上述方法,如果某个系统无法响应某个Intent,我会把菜单置灰。实现代码是非常简单和易于遵循的,具体如下:
/**
*Indicateswhetherthespecifiedactioncanbeusedasanintent.This
*methodqueriesthepackagemanagerforinstalledpackagesthatcan
*respondtoanintentwiththespecifiedaction.Ifnosuitablepackageis
*found,thismethodreturnsfalse.
*
*@paramcontextTheapplication'senvironment.
*@paramactionTheIntentactiontocheckforavailability.
*
*@returnTrueifanIntentwiththespecifiedactioncanbesentand
*respondedto,falseotherwise.
*/
publicstaticbooleanisIntentAvailable(Contextcontext,Stringaction){
finalPackageManagerpackageManager=context.getPackageManager();
finalIntentintent=newIntent(action);
List<ResolveInfo>list=
packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
returnlist.size()>0;
}
下面是具体的使用方法:
@Override
publicbooleanonPrepareOptionsMenu(Menumenu){
finalbooleanscanAvailable=isIntentAvailable(this,
"com.google.zxing.client.android.SCAN");
MenuItemitem;
item=menu.findItem(R.id.menu_item_add);
item.setEnabled(scanAvailable);
returnsuper.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
更多相关文章
- Android中关于Task的一些认识
- [置顶] Android开发学习之一——Android全景概述
- 《Android(安卓)Dev Guide》系列教程9:用户界面之声明布局
- WebView Apps
- 开发应用程序的Android(安卓)- 入门
- Android(安卓)最新面试题
- 【AndroidManifest.xml详解】Manifest属性之versionCode,version
- Android的进程
- 关于android service 重启