본문 바로가기

Android/Intent

안드로이드/Android intent(인텐트)를 사용해 보자. (intent filter)


 < 개발 환경 > 
   SDK 버전 : 안드로이드 SDK 2.1  
   API LEVEL : 7 
   이클립스 버젼 : Indigo
   테스트단말 : 삼성갤럭시 S2



안드로이드/Android intent(인텐트)를 사용해 보자. (intent filter)


안녕하세요. 오늘은 암시적 인텐트에 대해서 알아볼텐데요.! 인텐트는 안드로이드 시스템에서 커뮤니케이션을 담당하는 역할로 컴포넌트간(Activity, ContentProvider, BroadcastReceiver, Service) 의 호출과 메시지 전달에 이용한다. 쉽게 말해서 값을 주고 받는 전달자 정도로 생각 하시면 됩니다.


안드로이드에서는 시스템을 구성하는 4가지 컴포넌트가 있는데요. Activity(화면구성), BroadCastReceiver(방송수신), Service(백단작업), ContendProvider(Data공유) 들이 서로 유기적으로 시스템을 구성하고 있습니다. 그런데 이 4가지를 사용하면서, 서로 호환이 안된다면, 프로그램을 구성하는데 있어서 엄청난 제약을 받게 됩니다.


그렇기 때문에 intent를 이용해서 4가지 컴포넌트들이 서로 호출, 메시지, Data등을 주고받는 역할을 한다고 생각 하시면 됩니다. 


intent를 사용하는 방법에는 2가지 방법이 존재하는데요, 명시적 intent와 암시적 intent가 존재 합니다. 명시적 인텐트는 말 그대로 intent를 받는 대상을 명시해주는 방법이구요. 암시적 intent는 intent를 받는 대상을 명시해 놓지 않고, 호출 하는 방법 입니다.


보통 우리가 흔히 쓰는 방법은 명시적 intent인데요. 다음과 같이 사용 하시면 됩니다.

 
 Intent i = new Intent(FirstrActivity.this, SecondActivity.class);

 startActivity(i);


보시는 바와 같이, intent가 "SecondActivity라는 Class를 호출해라" 라고 명시 해놓고 호출 하고 있습니다. 이렇게 사용하는 방법이 명시적 intent 입니다. 이렇게 명시를 해준다면, intent 역시 정해진 곳 만 호출을 하게 됩니다.


다음은 암시적 intent를 사용하는 방법 입니다.

 
 Intent i = new Intent("arabiannight.tistory.com.intentfilter.secondview");

 startActivity(i);


암시적 intent를 사용하는 방법은 명시적 intent 처럼 지정된 곳을 호출 하는게 아니라 intent에 (action)을 추가해서 보내고 싶은 명령을 보내는 것 입니다. 물론 보내고 싶은 명령을 받아야 할 곳에는 intent에 추가해서 보낸 (action) 값을 추가해 주어야 합니다. 



이미지 출처 : 커니의 안드로이드(http://androidhuman.tistory.com/262)



위의 그림과 같이 무수히 많은 intent들이 다른 컴포넌트들에게 메시지를 보내지만, 호출을 받는 컴포넌트의 intent filter에 호출한 intent의 action 값이 정의 되어 있어야 통과 할 수 있습니다. 그래야 해당 intent를 컴포넌트에 전달하게 되고, 해당 컴포넌트는 intent에 실려온 메시지를 받아 작업을 수행 할 수 있게 되는 것 입니다.


 자 다음은 암시적 intent와 intent filter를 사용한 예제를 만들어 보겠습니다.


package arabiannight.tistory.com.intentfilter;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class FirstrActivity extends Activity {
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.first);
        
        Button button = (Button) findViewById(R.id.btn_call);
        button.setOnClickListener(new View.OnClickListener() {
        	
			@Override
			public void onClick(View v) {
				Intent i = new Intent("arabiannight.tistory.com.intentfilter.secondview");
		        startActivity(i);
		        
			}
		});
    }    
}


위의 예제에서 보는 것처럼 new Intent(String action) 값을 사용자 임의로 추가해서 호출 할 수 있습니다. 또한 시스템에서 제공하는 "Intent.ACTION_VIEW" 같은 action 값도 사용 할 수 있습니다. 
Intent i = new Intent("arabiannight.tistory.com.intentfilter.secondview");
startActivity(i);



"arabiannight.tistory.com.intentfilter.secondview" action 을 추가하게 되면, 다른 Activity(컴포넌트)에서 intent filter에 action값으로 "arabiannight.tistory.com.intentfilter.secondview" 를 등록하게 되면, 해당 intent를 호출 할 때, intent filter를 지정한 Activity에서는 메시지를 전달 받을 수 있게 됩니다.




    

    
        
            
                

                
            
        
        
        
            
                
                
            
        
        
    




여기서 주의해야할 사항이 있는데요, 위의 AndroidManifest.xml을 보게되면, intent filter에 <action> 말고도 <category>가 추가된 것을 볼 수 있을텐데요, 왜냐하면 intent로 Activity를 호출할 경우에DEFAULT category 를 반드시 추가 해야 하기 때문입니다. 그래서 intent filter에 DEFAULT category를 추가한 모습을 볼 수 있습니다.


반대로 intent를 보낼때에는 intent action만 추가한다면, 기본적으로 "android.intent.category.DEFAULT" category가 추가되서 보내 지기 때문에, action값만 설정해 주시면, 자동으로 DEFAULT category가 추가되서 보내 지게 됩니다.


아래는 암시적 intent로 호출한 화면 입니다.


이렇게 호출 하게 되면, intent filter에 action을 추가한 Activity가 호출 되게 됩니다. 다음은 다른 APP의 Activity에 intent filter에 추가한 경우 입니다.


다른 APP의 Activity의 경우에도 intent filter에 해당 action을 추가 하게 되면, intent를 호출시 실행 하게 됩니다. 위의 예제코드처럼 AndroidManifetst.xml에 파일에 intent filter를 추가해 주시면 됩니다.

 

다른 APP에 경우에도 해당 intent filter를 추가 하고, intent가 호출 됬을 경우 Activity가 실행 되게 됩니다. APP이 실행 중 이 아니더라도 단말에 설치가 되어있는 경우 에도 해당 intent를 받을 수 있습니다. 그렇기 때문에 해당 intent filter를 선언한 모든 Activity들이 호출 되게 됩니다.


다음은 TestIntentFliterReceiver APP의 AndroidManifest.xml 파일의 모습입니다.

 
 <activity

       android:name=".ForthActivity" >
        <intent-filter >
          <action android:name="arabiannight.tistory.com.intentfilter.secondview" />
          <category android:name="android.intent.category.DEFAULT" />
       </intent-filter>

 </activity>



자 이렇게 명시적 intent 와 암시적 intet 에 대해서 알아 보았습니다. 어떠신가요? ㅎ 참 intent란 재밌는 녀석인거 같다는 생각이 드시나요? ㅎㅎ 재 생각도 그렇습니다.


아무튼 intent에 대한 설명은 여기서 마치도록 하겠습니다. ^^





파일첨부 : 

TestIntentFilter.zip




참고 : 도서(커니의 안드로이드 이야기1)