Intent 존재여부 확인하기

Android는 Intent라고 불리는 아주 강력하지만 사용하기 편리한 Message Type을 제공한다. Intent를 사용함으로써 Applications을 고수준의 라이브러리로 바꾸어 코드의 모듈화 및 재사용을 가능하게 한다. 예를 들어, Android Home Screen과 응용프로그램의 단축 버튼들은 단축키를 생성하는데 Intents를 광범위하게 사용하고 있다.

느슨하게 결합되어 있는 API를 사용하는 것이 좋은 반면 사용자가 보내는 Intent가 다른 Application에 의해 받아지는 것에 대한 확신은 가질 수 없다. 이러한 현상은 Panoramio(위치정보를 제공하는 App)와 그것의 RADRA Intent와 같이 3rd-party Apps에서 특히 일어난다.

이번 Article은 여러분이 사용하고 싶어하는 Intent를 처리할 수 있는 어떤 Application을 시스템이 포함하고 있는지를 알아볼 수 있는 Technique을 기술하게 된다. 아래의 예제는 시스템 Package Manager에게 어떤 App이 특정 Intent에 응답할 수 있는지의 여부를 결정하도록 요청하는 Helper Method를 보여준다. 여러분의 응용프로그램은 해당 Method로 Intent를 보낼 수 있고, 예를 들자면 그런 다음에 해당 Intent를 보낼 수 있는 사용자 Options을 숨기거나 보여줄 수 있다.

/** 
* 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;
}

다음에는 그러한 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);
}

이러한 예제에서, Barcode Scanner Application이 설치되어 있지 않다면 Menu는 비활성화 처리된다.

좀더 간단하게 startActivity()를 호출했을 때 ActivityNotFoundException을 캐치하도록 하는 또다른 방법이 있지만 그러한 문제발생에 반응만 할 수 있다. 즉, 여러분은 그러한 것을 예측할 수 없고 동작하지 않기를 바라는 무언가를 차단하는 것에 따라 UI를 업데이트할 수 없다는 것이다. 또한 여기에 기술된 방법은 설치 되지않은 패키지를 설치하고자 하는지를 사용자에게 Startup time시에 묻는데 사용될 수 있다. 그런 다음, 적당한 URI를 사용하여 사용자를 Android Market으로 간단하게 안내할 수 있게 된다.