반응형

 안드로이드의 가장 중요한 기능중 하나는 실행하기를 원하는 "action" 을 기반으로 다른 앱으로 사용자를 보내는 능력(다른 앱을 실행하는 능력)입니다. 예를 들어, 만약 여러분 앱이 지도에 보여주고 싶은 업체 주소를 가지고있는데, 여러분의 앱안에는 지도를 보여주는 액티비티가 없다면 이를 대신하여 여러분은 Intent를 사용하여 맵에 주소를 보여주도록 요청할 수 있습니다. 그렇게 하면 안드로이드 시스템은 맵 위에 해당 주소를 보여줄 수 있는 앱을 시작합니다.


 이 게시판의 첫번째 포스트 "첫번째 앱 만들기(Building Your First App)"에서 설명했듯이, 여러분은 여러분의 앱이 가지고 있는 액티비티들 사이를 이동하기 위해서는 Intent 를 사용해야만 합니다. 여러분은 일반적으로 여러분이 시작하기를 원하는 확실한 컴포넌트의 클래스 이름을 정의한 명시적(explicit) 인텐트를 통해 이 작업을 합니다. 어쨋든, 여러분이 "지도보기"와 같이 하나의 action을 수행하는 별도의 다른 앱을 실행하고자 한다면 여러분은 반드시 암시적(implicit) 인텐트를 사용해야만 합니다.


 이번 시간에는 여러분에게 특정 action 에 대한 암시적 인텐트를 만드는 방법과 다른 앱안에서 이 액션을 수행하는 액티비티를 실행하도록 이 인텐트를 사용하는 방법을 소개하도록 하겠습니다. 



암시적 인텐트 만들기 (Build an Implicit Intent)

--------------------------------------

암시적 인텐트는 시작될 컴포넌트의 클래스 이름을 선언하지 않습니다. 대신 실행 할 action을 선언합니다. action 은 무엇인가를 보여주고, 만들고, 전송하고, 얻어오는 등의 여러분이 동작하길 원하는 것을 지정합니다. Intent는 또한 여러분이 지도에 보여주길 원하는 주소, 또는 전송하고 싶은 이메일(email) 같은 action 과 조합된 데이터를 포함하고 있습니다. 이 데이터는 여러분이 만들기를 원하는 Intent에 따라, Uri 객체가 될수도 있고, 또 다른 다양한 데이터 타입 중 하나일 수도 있으며 또는 어떤 데이터도 필요하지 않을 수도있습니다.


만약 여러분의 데이터가 Uri 타입이라면, action 과 data 를 정의하는데 사용할 수 있는 간단한 Intent() 생성자(constructor)가 있습니다.


예들 들어보겠습니다. 아래는 전화 번호를 지정한 Uri 데이터를 사용하여 전화 걸기를 초기화하는 Intent를 만드는 방법을 보여주고 있습니다.

 Uri number = Uri.parse("tel:5551234");

 Intent callIntent = new Intent(Intent.ACTION_DIAL, number);

여러분의 앱이 startActivity() 메소드를 호출해서 이 인텐트를 발동시기면, 전화 앱이 시작되고 이 앱은 주어진 전화번호로 초기화합니다.


아래는 action 과 Uri data 쌍의 다른 인텐트들의 예입니다.


지도보기:

 // Map point based on address

 Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");

 // Or map point based on latitude/longitude

 // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level

 Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);



웹뷰(WebView) 보기:

 Uri webpage = Uri.parse("http://www.android.com");

 Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);



 암시적(implicit) 인텐트의 다른 종류들은 String과 같이 다른 데이터 타입을 제공하는 "extra"데이터를 요구합니다. 여러분은 다양한putExtra() 메소드를 사용해서 하나 또는 그 이상의 extra 데이터 추가할 수 있습니다.



기본적으로 시스템은 포함된 Uri 를 기반으로 Intent에 의해 요구되는 적절한 MIME(Multipurpose Internet Mail Extensions) 타입을 결정합니다. 만약 여러분이 Intent 안에 Uri 을 포함시키지 않았다면, 일반적으로 인텐트와 조합된 데이터의 타입을 지정하기 위한setType() 메소드을 사용해야 합니다. MIME 타입을 설정하는 것은 나중에 인텐트를 받아야 하는 액티비티들의 종류를 지정하는 것입니다.



아래는 여러분이 원하는 action을 지정하기 위한 extra 데이터를 추가한 Intent 들의 몇가지 예시입니다.


첨부파일과 함께 이메일 보내기

 Intent emailIntent = new Intent(Intent.ACTION_SEND);

 // The intent does not have a URI, so declare the "text/plain" MIME type

 emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);

 emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients

 emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");

 emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");

 emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));

 // You can also attach multiple items by passing an ArrayList of Uris


달력(Calendar) 이벤트 생성하기

 Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);

 Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);

 Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);

 calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());

 calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());

 calendarIntent.putExtra(Events.TITLE, "Ninja class");

 calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");

Note : Calendar 이벤트에 대한 이 인텐트(intent)는 API 14 버전 이상에서만 제공되어집니다. 


Note : 가능한 명확하게 여러분의 Intent 를 정의하는 것을 중요합니다. 예를 들어, 만약 여러분이 ACTION_VIEW 인텐트를 사용하여 이미지를 보여주기를 원함다면 여러분은 image/* 로 MIME 타입을 지정하셔야만 합니다. 이것은 인텐트에 의해 앱이 시작될 때"view" 할 수 있는 다른 데이터 타입( 지도보기 처럼)의 앱이 실행되는 것을 방지합니다.

반응형

+ Recent posts