Can I Use this Intent? Android中不要发送没有接收应用的Intent.

来源:互联网 发布:汤不热是什么软件 编辑:程序博客网 时间:2024/06/02 07:16

Android中Intent如果没有接收对象,就不要发送了, 因为可能导致系统Crash,所以我们在发送前检查有没有应用的Intent,下面是Android的解释:我们直接

Android offers a very powerful and yet easy-to-use message type called an intents. 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.

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 Panoramio and its RADAR intent.

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.

/** * 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);                                //queryIntentServices(Intent intent, int flags)    return list.size() > 0;}

Here is how you could use the helper method:

@Overridepublic 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);}

In this example, the menu is grayed out if the Barcode Scanner application is not installed.

Another, simpler, way to do this is to catch the ActivityNotFoundException when calling startActivity() 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.


原创粉丝点击