"암시적(Implicit) 액티비티 호출" 입니다.
암시적인란 말은 콕 집어서 "요 액티비티를 호출해 주세요"가 아니라 "(사진, 전화, 주소록 같은)이런것을 볼 수 있는 액티비티를 보여주세요" 라 할 수 있겠다.
즉, 불특정 어플 컴포넌트가 액션요청을 할 수 있도록 하는 메커니즘입니다.

그럼 시스템이 어떻게 해당 액티비티를 선택하여 보여줄 수 있을까?
바로 호출을 위해서 어플을 만들때, 시스템에게 미리 정보를 제공해 주어야 합니다.
그리고, 개발자는 임의의 인텐트에 대해서 어떤 동작을 하는지 알아야 한다. 
이것은 "Intent Resolution 확인"에 의해서 가능한데 "Intent Resolution 확인"는 인텐트를 처리할 수 있는  액티비티, 브로드캐스크 수신자, 서비스 정보를 가지고 있습니다.

Intent Resolution 매커니즘은 기본적으로 설치된 어플리케이션 패키지들의 모든 <intent-filter> 요소들의 인텐트를 매칭하고 있습니다.
한 어플를 다른 어플에서 사용하게 하기 위해서 AndroidManifest.xml 에 등록을 할 수 있다고 합니다.
이 부분은 배우지 못해서 다음을 기약하도록 하겠습니다.

명시적 액티비티 호출하는 샘플을 보겠습니다.

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViewById(R.id.web).setOnClickListener(this.btnClickListener);
  
findViewById(R.id.dial).setOnClickListener(this.btnClickListener);
findViewById(R.id.image).setOnClickListener(this.btnClickListener);
}

Button.OnClickListener btnClickListener = 
new Button.OnClickListener() {
public void onClick(View v){
Intent intent = null;
switch(v.getId()){
case R.id.web :
intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
break;
case R.id.dial :
intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:010-1234-5678"));
break;
case R.id.image :
intent = new Intent(Intent.ACTION_VIEW);
Uri uri=  Uri.fromFile(new File("/sdcard/flowers.jpg"));
intent.setDataAndType(uri, "image/jpeg");
break;
}
if( intent != null )
startActivity(intent);
}
};

버튼 3개를 UI에 두고 인터넷, 전화, 이미지뷰어 3개의 호출을 했습니다.
위의 정보를 참고하면 아마 웹브라우저, 전화걸기, 이미지뷰어의 어플에 다른 어플이 사용할 수 있도록
AndroidManifest.xml 파일에 등록을 했을거라는 것을 짐작이 되는 것 같습니다.

이 중에 마지막 이미지 뷰어부분이 있는데 sdcard에 있는 그림파일을 보여주는 건데 시뮬레이터로 어떻게 
사용할 수 있는지 봅시다.

1. Android AVD Manager 에서 sdcard 를 사용할수 있는 가상 디바이스를 하나 만듭니다.




2. 현재 프로젝트의 디바이스를 현재 생성한 디바이스로 변경하고 실행합니다.



3. adb( Adroid Debug Shell) 를 사용하여 sdcard에 이미지를 넣습니다.


4. adb를 사용하여 쉘에 접속하여 sdcard 에 제대로 들어갔는지 확인합니다.



Posted by hgjung

댓글을 달아 주세요