Search Results

Search Results for 'Intent' : 2 POSTS

  1. 2011.01.14 Intent 존재여부 확인하기
  2. 2010.08.15 인텐트란? (Intent)

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으로 간단하게 안내할 수 있게 된다.


인텐트란? (Intent)



안드로이드 인텐트란? (Android Intent)

- 안드로이드 시스템에서 커뮤니케이션을 담당하는 역할로 컴포넌트간의 호출과 메시지 전달에 이용한다

- 런처에 나타나지 않는(루트 액티비티가 아닌) 액티비티를 실행시킬 때 사용한다

- Activity, Service, Broadcast Receiver 컴포넌트를 활성화 시킬 수 있다

- startActivity(), startActivityForResult()에 포함되어 Activity를 호출하며, 호출된 액티비티는 getIntent()를
  이용해 메시지를 전달받고, 이후 전달받은 메시지는 onNewIntent()를 override하여 전달받을 수 있다

- startActivityForResult()를 이용해 호출된 액티비티는 인텐트에 반환값을 넣어 다시 자신을 호출한
  액티비티에게 되돌려 줄 수 있으며 이때에는 setResult()에 인텐트를 포함시켜 반환한다

- startService(), bindService()에 포함되어 Service를 호출하며, 호출된 서비스는 onStart(), onBind()를
  override하여 메시지를 전달받을 수 있다

- sendBroadcast(), sendOrderedBroadcast(), sendStickyBroadcase()등에 포함되어 Broadcast를 호출하며
  호출된 브로드캐스트는 onReceive()를 override하여 메시지를 전달받을 수 있다

- 이외에도 PendingIntent 라는 권한을 위임하는 인텐트가 있다

- 메시지를 전달할때 putExtra()를 사용하며 전달받을때에는 getExtras().get변수타입() 또는
  get변수타입Extra()을 사용한다


암시적 인텐트

ACTION_SEND를 이용한 암시적 인텐트 적용시 나오는 Chooser

명시적 인텐트와 암시적(묵시적) 인텐트 (Explicit intent & intent)

- 인텐트를 사용할때에는 명시적으로 하나의 컴포넌트를 선택하여 메시지를 전달하는 방법과
  암시적으로 여러 컴포넌트중 지정한 특성을 가진 컴포넌트중 하나를 선택하여 사용하는 방법이 있다

- 암시적 인텐트는 명시적으로 알지 못하는 컴포넌트 중 자신이 활용 가능한 컴포넌트를 다른
  어플리케이션으로부터 불러서 사용할 수 있게 해주어 여러 어플리케이션의 컴포넌트를 활용가능하게 한다
  이로인해 어플리케이션의 경계없이 서로다른 어플리케이션을 하나처럼 사용 가능하게 해준다

- 명시적 인텐트는 실행할 컴포넌트의 클래스명을 지정하여 활성화 시킨다

- 암시적 인텐트는 Action, Category, Data를 사용해 인텐트 필터에(intent filter) 걸러내고 남는
  컴포넌트를 찾아(인텐트해석:intent resolving) 이중 한가지를 createChooser()로 선택하여 실행시킨다

- 인텐트 필터는 하나뿐이 아닌 여러개를 지정하여 일치하는 필터가 있을경우 통과할 수 있다

- Action은 AndroidManifest에 정의해놓은 각각의 컴포넌트가 처리할 행동을(Action) 참조하여 사용자가
  지정한 Action과 일치하는 컴포넌트를 찾아내며 지정된 Action이 없을경우 일치한 것으로 간주한다

- Category는 AndroidManifest에 정의해놓은 각각의 컴포넌트 분류를(Category) 참조하여 사용자가
  지정한 Category와 일치하는 컴포넌트는 찾아내며 지정된 Category가 없을경우 Category가 지정되지
  않은 컴포넌트만 일치한 것으로 간주한다

- Data는 AndroidManifest에 정의해놓은 각각의 컴포넌트 URI를 참조하여 사용자가 지정한 type 또는
  schema등 과 일치하는 컴포넌트는 찾아낸다

- 인텐트를 이용한 브라우저에 웹페이지 띄우기 예제
  Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));

Intent-Filter 값
Intent 클래스의 정의 AndroidManifest 일치값 설명
ACTION_MAIN android.intent.action.MAIN 시작(루트) 액티비티
ACTION_VIEW android.intent.action.VIEW 해당 자원을 보여주는 액션
ACTION_CALL android.intent.action.CALL 전화를 거는 액션
ACTION_DIAL android.intent.action.DIAL 전화 다이얼이 나오는 액션
ACTION_SEND android.intent.action.SEND 문자,메일등 데이터를 보내는 액션
ACTION_SCREEN_ON android.intent.action.SCREEN_ON 화면이 켜지는 액션
ACTION_BATTERY_LOW android.intent.action.BATTERY_LOW 배터리 부족 액션

Intent 클래스의 정의 AndroidManifest 일치값 설명
CATEGORY_DEFAULT android.intent.category.DEFAULT 기본 카테고리
CATEGORY_LAUNCHER android.intent.category.LAUNCHER 어플리케이션 런쳐로 실행되는 분류
CATEGORY_HOME android.intent.category.HOME 홈스크린에 표시되는 액티비티
CATEGORY_BROWSABLE android.intent.category.BROWSABLE 인터넷 브라우저 사용분류

http://developer.android.com/guide/topics/intents/intents-filters.html#iobjs