Development/Android

7. 액티비티와 Intent

궁선이 2018. 5. 5. 01:36

오늘은 액티비와 액티비티간 통신에 대해서 다뤄보려고 합니다.

자세한 내용은 Android Developers를 참조하여 주시기 바랍니다.
https://developer.android.com/guide/components/activities.html

Android Developers에 있는 내용을 참고하자면

Activity는 일종의 애플리케이션 구성 요소로서, 사용자가 전화 걸기, 사진 찍기, 이메일 보내기 또는 지도 보기 등의 일을 하기 위해 상호작용할 수 있는 화면을 제공합 니다. 액티비티마다 창이 하나씩 주어져 이곳에 사용자 인터페이스를 끌어올 수 있습니다. 이 창은 일반적으로 화면을 가득 채우지만, 작은 창으로 만들어 다른 창 위에 띄울 수도 있습니다.

라는 것이 Activity의 정의입니다.

다시말해 우리가 앱을 사용할때 화면에 나타나는 화면들을 액티비티라고 생각하시면 됩니다.
정확히는 해당 화면을 띄워주는 보드라고 생각하셔도 됩니다.

액티비티의 핵심기능 2가지를 뽑아보자면
1. 레이아웃 및 UI 표시
2. 이벤트 처리
가 될 수 있습니다.

액티비티에 레이아웃을 탑재하는 함수는 oncreate()안에 있는

setContentView(idOfLayout); //레이아웃의 경로를 파라미터로 전달 ex)R.layout.activity_main

함수에서 지정된 레이아웃을 호출한 액티비티에 붙여줍니다.

액티비티는 새로 생성될 시 이전의 액티비티를 종료하지 않는다면
이전 액티비티 위에 쌓이는 형태로 새로운 액티비티가 실행됩니다.
만약 액티비티가 많이 사용되는 앱이라면 그 이전 액티비티를 끝내주는게
오버헤드가 적어집니다.

그리고 

Activity는 객체지향의 관점에서 봤을 때 각각 별개의 클래스입니다.
이 말은 액티비티들 간의 우체부가 존재하여 Activity간 통신을 해주어야 한다는 것입니다.
이 우체부 역할을 해주는 것이 바로 Intent입니다.

다음은 Activity의 생명주기 입니다.
언제 어떤 Activity가 생성되고 언제 사라지는지에 대한 도식이라고 볼 수 있습니다.

https://developer.android.com/guide/components/activities.html

여러개의 액티비티들이 있을 때 먼저 실행할 액티비티를 고르려면
AndroidManifest.xml 파일에서
<intent-filter></intent-filter>을 잘라내기하여 원하는 액티비티의 사이에
다음 코드와 같이 붙여넣기 합니다.

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> </intent-filter> <activity>
Intent 사용하기

Intent는 쉽게 생각하면 다른 Activity를 호출하여 준다고 볼 수 있으며
그와 동시에 그 Activity에 특정신호를 보낼 수 있습니다.
예를들면
친구들끼리 가위바위보를 한다고 칩시다.
특정 한 친구를 호출하여 신호를 보냅니다.
1. 친구를 호출한다.
2. 눈을 깜빡이면 주먹
3. 기침을 하면 가위
4. 머리를 긁으면 보자기
를 내는 식으로 호출을 하고 신호를 보낼 수 있습니다.
바로 Intent가 이러한 역할을 하여줍니다.

Intent에는 크게 두가지 종류가 있습니다.
Explicit Intent
Implicit Intent

Explicit Intent란
명시적 인텐트로써 다른 컴포넌트의 이름을 명확히 지목하여 호출 하는 것입니다.
예를들면 

Intent intent = new Intent(this, SecondActivity.class); startActivity(intent);

위와 같이 지목을 하여 호출을 합니다.

Implicit Intent란
암시적 인텐트로써 미리 정의된 액션(Action)을 지정하여 안드로이드에서 제공하는 기존 응용 프로그램을 실행합니다.
예를들면

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:/0101112222")); startActivity(intent);

위와 같이 사전에 정의된 액션을 호출하여 줍니다. 위의 예제는 전화걸기 Intent입니다.

Explicit Intent
1) Activity 호출하기

작업을 수행할 Activity를 지정하고 intent에 넣어줍니다.
this - 현재 activity
SecondActivity - intent를 보낼 activity

Intent intent = new Intent(this, SecondActivity.class); startActivity(intent);
2) 정보전달과 호출

전달하기
putExtra는 크게 두가지로 이루어져 있습니다.
태그는 내가 보낸 데이터를 식별하기 위한 암구호(코드) 라고 보시면 됩니다.
그리고 두번째 파라미터로 내가 전송하고자 하는 데이터를 보냅니다.
String뿐만 아니라 객체, 숫자도 전달이 가능합니다.

Intent intent = new Intent(this, SecondActivity.class); Intent.putExtra(“name”, information); // putExtra(태그, 전송할 데이터); startActivity(intent);

 정보 받기
정보를 받는것을 어렵지 않습니다.
intent를 생성하여 전달된 intent를 받은뒤
태그를 사용해서 데이터를 구분합니다.
그리고 나서 구분된 데이터를 저장합니다.

데이터를 가져오는 함수는 여러가지가 있습니다.
int Type : getIntExtra();
 float Type : getFloatExtra(); 
double Type : getDoubleExtra();
 String Type : getStringExtra(); 
Parcelable type : getParcelableExtra(); (객체전달)
이 중 Parcelable 타입은 19번 포스팅을 참조하시기 바랍니다.

Intent intent = getIntent(); String name = intent.getStringExtra("name");
3) 양방향 데이터 전송

양방향 데이터 전송을 쉽게보면 4단계 입니다.
(1) 정보전달- Activity1
(2) 정보수령 - Activity2
(3) 재전송할 정보 탑재 및 잘 수령했다는 신호 전달 - Activity2
(4) 잘 수령했다는 신호 인식 및 전송된 데이터 구분 - Activity1

정보전달

Intent intent = new Intent(this,Main2Activity.class); intent.putExtra("data",data); startActivityForResult(intent,_ADD_QUERY); /* * startActivityForResult는 답변을 바라는 목표의 함수 입니다. * 뒤에 붙인 _ADD_QUERY는 임의의 숫자로 임의로 숫자를 지정해 자신이 보내는 신호의 * 목적을 구분해주고 태그에 붙어서 다시 되돌아올때 같이 돌아옵니다. */

정보 수령

Intent intent = getIntent(); //이후 데이타 수령은 자유

재전송할 정보 탑재 및 잘 수령했다는 신호 전달

Intent intent = getIntent(); String rename = "resend" intent.putExtra("data",rename); ( setResult(RESULT_CANCELED,intent); OR setResult(RESULT_OK,intent);) /* * 전송받은 Tag로 다시 데이터를 전송해주면 setResult 두가지 중 하나를 선택해 데이터를 잘 * 받았는지 여부를 앞의 인자로 보내줍니다. */

잘 수령했다는 신호 인식 및 회신된 데이터 구분.

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if(requestCode == _ADD_QUERY){ if(resultCode == RESULT_OK){ String = data.getStringExtra("name"); } }else{ if(resultCode == RESULT_OK){ } } super.onActivityResult(requestCode, resultCode, data); }
Implicit Intent

Implicit 인텐트는 안드로이드에서 제공하여주는 기존 응용프로그램을 실행합니다.

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:/0101112222")); startActivity(intent);

위 코드를 Activity에 넣어주시고

AndroidManifest.xml 파일에 들어가셔서 권한을 부여해주어야 합니다.

<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission> <application></application> //application 밖에 지정