diff options
Diffstat (limited to 'docs/html/resources/articles/can-i-use-this-intent.jd')
-rw-r--r-- | docs/html/resources/articles/can-i-use-this-intent.jd | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/docs/html/resources/articles/can-i-use-this-intent.jd b/docs/html/resources/articles/can-i-use-this-intent.jd new file mode 100644 index 0000000..a726189 --- /dev/null +++ b/docs/html/resources/articles/can-i-use-this-intent.jd @@ -0,0 +1,69 @@ +page.title=Can I Use this Intent? +@jd:body + +<p>Android offers a very powerful and yet easy-to-use message type called +an <a href="{@docRoot}guide/topics/intents/intents-filters.html">intents</a>. +You can use intents to turn applications into high-level libraries and +make code modular and reusable. The Android Home screen and AnyCut +applications, for instance, use intents extensively to create shortcuts. </p> + +<p>While it is nice to be able to make use of a loosely coupled +API, there is no guarantee that the intent you send will be received by +another application. This happens in particular with third-party apps, like +<a href="http://code.google.com/p/apps-for-android/source/browse/trunk/Panoramio">Panoramio</a> +and its RADAR intent.</p> + +<p>This article describes a technique you can use to find out whether the system +contains any application capable of responding to the intent you want to use. +The example below shows a helper method that queries the system package manager +to determine whether there's an app that can respond to a specified intent. Your +application can pass an intent to the method and then, for example, show or hide +user options that the user would normally use to trigger the intent. </p> + +<pre class="prettyprint">/** + * 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; +} +</pre> + +<p>Here is how you could use the helper method:</p> + +<pre class="prettyprint">@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); +} +</pre> + +<p>In this example, the menu is grayed out if the <em>Barcode Scanner</em> +application is not installed. </p> + +<p>Another, simpler, way to do this is to catch the +<code>ActivityNotFoundException</code> when calling <code>startActivity()</code> +but it only lets you react to the problem, you cannot predict it and update the +UI accordingly to prevent the user from doing something that won't work. The +technique described here can also be used at startup time to ask the user +whether he'd like to install the missing package, you can then simply redirect +him to the Android Market by using the appropriate URI.</p>
\ No newline at end of file |