[안드로이드/Android] PART1 인텐트와 인텐트 필터

Posted by 앱해피
2015. 6. 22. 16:38 안드로이드 이론

 

인텐트와 인텐트 필터(Intents and Intents Filters)

 

다른 APP 컴포넌트에서 액션을 요청할 때, 사용할 수 있는 메시지 객체가 인텐트(Intent)다. 인텐트는 서로 다른 컴포넌트 사이에서 여러가지 방식으로 통신할 수 있지만, 대표적으로 3가지 방식이 있다.

 

1) 액티비티를 시작하기 위해서

 

액티비티(Activity)는 어플리케이션에서 한 화면을 나타낸다. startActivity()에 인텐트 정보를 전달 함으로써 새로운 액티비티 인스턴스를 시작할 수 있다. 인텐트는 시작할 액티비티를 나타내고 추가적으로 필요한 데이터도 전달한다.

 

만약 다른 액티비티가 종료되고, 종료될 때 반환된 데이터를 수신하고자 할 때, startActivityForResult() 메소드를 호출해야 한다. 액티비티의 onActivityResult()라는 콜백 메소드에서 별도의 인텐트 객체 형태로 데이터를 전달받을 수 있다.

 

2) 서비스를 시작하기 위해서

 

서비스는 백그라운드에서 기능을 수행하는 컴포넌트다. startService()에 인텐트를 전달함으로써 서비스가 백그라운드에서 어떤 작업을 처리하게끔 할 수 있다. 인텐트에 시작하고자 하는 서비스 정보와 필요한 데이터를 전달해야 한다.

 

서비스가 비록 클라이언트-서버 인터페이스를 기반으로 설계되어 있지만, bindService()에 인텐트를 전달함으로써 다른 컴포넌트에서 서비스와 결속(Binding) 될 수 있다.

 

3) 브로드 캐스트를 전달하기 위해서

 

브로드캐스트란 어플리케이션에서 받을 수 있는 메시지다. 시스템은 시스템 이벤트로 다양한 브로드캐스트를 발송한다. 개발되는 어플리케이션에서도 sendBroadcast(), sendOrderedBroadcast() 그리고 sendStickyBroadcast()에 인텐트를 전달함으로써 다른 어플리케이션에 브로드캐스트를 전달할 수 있다.

 

인텐트 유형(Intent Types)

 

인텐트 종류는 2가지다.

 

명시적 인텐트(Explicit intents)는 시작하고자 하는 컴포넌트의 이름을 명시해야 한다. 보통, 시작하고자 하는 액티비티나 서비스의 클래스 이름을 알기 때문에, 개발되는 어플리케이션에서 다른 컴포넌트를 시작할 때 보통 명시적 인텐트(Explicit intents)를 사용한다.

 

암시적 인텐트(Implicit intents)는 구체적인 컴포넌트의 이름을 사용하지 않는다. 대신에 보통 인텐트를 통해서 하고자 하는 액션(action)정보를 입력한다. 예를 들어, 사용자에게 지도상의 위치를 보여주고 싶을 때, 지도상에 지정된 위치를 보여주는 기능을 담당하는 다른 어플리케이션에 관련 요청을 보내는 암시적 인텐트를 사용할 수 있다

.

액티비티 또는 서비스를 시작하기 위해서 명시적 인텐트를 생성할 때, 시스템은 전달되는 인텐트 객체에 명시된 어플리케이션을 컴포넌트를 바로 시작한다.

 

암시적 인텐트를 생성할 때, 안드로이드 시스템은 매니페스트 파일에 선언된 인텐트 필터와 암시적 인텐트의 내용을 비교함으로써 적절한 컴포넌트를 찾는다. 1) 암시적 인텐트가 특정 인텐트 필터와 매칭될 때, 시스템은 해당 컴포넌트를 시작한 뒤 인텐트를 그 컴포넌트에 전달한다. 2) 암시적 인텐트와 매칭되는 컴포넌트가 다수일 때, 시스템은 어떤 컴포넌트를 사용할 것인지 대화상자 형태로 보여주게 된다.

 

인텐트 필터란 어플리케이션의 매니페스트 파일에 존재하는 표현이다. 인텐트 필터를 사용해서 해당 컴포넌트가 받을 수 있는 암시적 인텐트 타입을 명시할 수 있다. 예를 들어, 액티비티와 관련된 인텐트 필터를 선언함으로써, 특정 암시적 인텐트를 사용해서 액티비티를 시작할 수 있고. 이와 유사하게 액티비티에 인텐트 필터를 명시하지 않는다면, 명시적 인텐트를 사용해서 해당 컴포넌트를 시작시켜야 한다.

 

[주의] : 어플리케이션이 보안을 위해서, 서비스를 사용할 땐, 명시적 인텐트를 사용하자 그리고 서비스와 관련된 인텐트 필터는 사용하지 말자. 서비스를 시작할 때 암시적 인텐트를 사용한다면 보안상 문제가 발생할 수 있다. 암시적 인텐트에 의해서 의도하지 않은 서비스가 동작할 수도 있기 때문이다. 안드로이드 5.0부터 시스템에서는 명시적 인텐트를 사용해서 bindService()를 호출할 때, 예외를 발생시키도록 설계되어있다.