Intent
by 민갤
Intent
수행할 작업에 대한 추상적인 설명.
서로 다른 컴포넌트들이 작업을 요청할 때 사용되는 메시지 객체.
Intent intent = new Intent();
//or
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(Intent) 메소드를 사용하여 Activity를 시작시킬 수 있다.
관심있는 BroadcastReceiver에 broadcastIntent를 사용하여 보낼 수 있고,
background Service와 통신하기 위해 startService(Intent) 나 bindService(Intent, ServiceConnection, int) 를 사용할 수 있다.
다른 어플리케이션의 코드에서 동적 바인딩(runtime/late binding)을 실행할 수 있게 하는 기능을 제공한다.
주 기능은 액티비티를 실행시키는 것이며, 서로 다른 액티비티들을 연결한다.
*동적 바인딩: 프로그램이 실행되어야 메모리에 크기가 얼마만큼 할당되는지 알 수 있게 되는 것.
Starting an activity
Intent 안에 실행할 액티비티의 이름(필수)과, 새 액티비티로 전달할 데이터(선택)를 담아
startActivity(Intent intent) 메소드에 전달하면 새로운 액티비티를 실행할 수 있다.
Intent intent = new Intent();
startActivity(intent);
실행시킨 액티비티에게서 응답을 받으려면 startActivityForResult(Intent intent, int requestCode) 메소드에
Intent와 코드(한 액티비티에서 여러 액티비티를 실행했을 때 각 액티비티를 구분하기 위한 용도)를 함께 전달하여 실행시킨 후,
final int CODE_SECOND = 1;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
startActivityForResult(intent, CODE_SECOND);
onActivityResult(int requestCode, int resultCode, Intent data) 콜백을 통해 Intent 객체로 받는다.
...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case CODE_SECOND:
break;
}
}
}
• requestCode (요청 코드): 정수. 액티비티에 부여했던 코드 값을 돌려받아 어느 액티비티가 응답 한 것인지 식별한다.
• resultCode (응답 코드): 정수. 실행한 액티비티의 응답 상태를 알려준다.
• data: Intent 객체.
Starting a service
UI 없이 백그라운드에서 작업을 수행하는 Service.
Android 5.0 (API level 21) 이상에서는 JobScheduler 를 이용하여 Service를 실행할 수 있다. (JobScheduler API 문서 참조)
Android 5.0 (API level 21) 이하는 Service 클래스의 메소드를 사용하여 실행할 수 있다.
• startService(Intent service)
파일 다운로드 같은 일회성 작업을 수행하는 서비스.
Intent에 실행할 서비스에 대한 정보(필수)와 넘겨줄 데이터(선택)을 담아 startService()에 전달한다.
• bindService(Intent service, ServiceConnection conn, int flags)
서비스가 클라이언트-서버 구조로 구성된 경우 위와 같은 Intent를 bindService()에 전달하여 서비스를 bind 할 수 있다.
- ServiceConnection: 서비스가 시작되거나 종료되면 정보를 받는다. 유효한 ServiceConnection 개체 여야 한다. null 불가능.
- int: bind 작업을 위한 옵션. BIND_AUTO_CREATE, BIND_DEBUG_UNBIND, BIND_NOT_FOREGROUND,
BIND_ABOVE_CLIENT, BIND_ALLOW_OOM_MANAGEMENT, or BIND_WAIVE_PRIORITY. 0 가능. (BIND 문서 참조)
Delivering a broadcast
A broadcast is a message that any app can receive.
broadcast(알림)는 모든 앱이 수신할 수 있는 메시지.
시스템 이벤트(장치가 충전을 시작하거나 시스템이 부팅되는 등)에 대한 broadcast를 전달한다.
Intent를 sendBroadcast(Intent intent) 또는 sendOrderedBroadcast(Intent intent, String receiverPermission)에 전달하여
다른 App에 broadcast를 전달할 수 있다.
• receiverPermission (선택사항)
사용 권한을 설정하여 권한을 가진 broadcast만이 수신할 수 있게 한다
null을 입력할 경우 권한이 필요 없다.
Extras
요청한 작업을 수행하는데 필요한 정보를 담고 있는 키-값 조합.
몇몇 작업은 특정 종류의 URI를 사용하는 것처럼, 몇몇 작업은 특정 엑스트라를 사용한다.
Intent에 Extra 정보를 추가하기 위해 putExtra(String name, Bundle value) 메소드를 사용한다.
두 개의 매개변수는 키 이름과 값으로, 항상 쌍으로 다닌다.
Extra 정보를 가진 Bundle 객체를 생성하여 값으로 넘길 수도 있다.
예) 이메일을 쓰기 위한 액티비티를 실행할 때, 받는 이와 메일 제목을 전달할 경우.
정보가 미리 채워져 있도록 할 경우 Intent Action 중 ACTION_SEND를 사용한다.
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND)
intent.putExtra(Intent.EXTRA_EMAIL, “수신자 정보”);
intent.putExtra(Intent.EXTRA_SUBJECT, “이메일 제목”)
Intent 클래스는 표준화된 데이터 유형의 키 값에 대하여 EXTRA_* 상수가 많이 지정되어 있다.
직접 키를 정의할 경우 앱의 패키지 이름을 접두어로 포함시킨다.
static final String EXTRA_GIGAWATTS = "com.example.EXTRA_GIGAWATTS";
실행된 액티비티에서 Intent가 전달해준 데이터(Extra)를 받을 때는 다음과 같다.
//문자열일 경우
String str = getIntent().getStringExtra(String name);
//정수일 경우. key가 없으면 default 값 반환
int a = getIntent().getIntExtra(String name, int defaultValue);
//boolean
boolean flag = getIntent().getBooleanExtra(String nama, boolean defaultValue);
- 본 내용은 Intents and Intent Filters 일부를 번역한 내용이 지배적입니다.