안드로이드 정리노트 #8 안드로이드 인텐트와 부가데이터
(Android Intent, Extras Data)
@액티비티 전환과 Intent
- 인텐트는 앱 구성요소 간에 데이터를 전달, 혹은 실행하는 기능에 대하여 시스템에 알리는 역할을 한다.
- 앱 개발에 있어서 앱의 구성요소인 액티비티를 전환하는 과정 혹은 특정 기능을 동작시켜야 한다. 여기서 인텐트가 수단으로 사용된다.
- 전환과정에서 인텐트를 통해 어떤 액티비티로 전환할 것인지, 어떠한 데이터를 보낼 것인지에 대한 정보를 품고 있는 것으로 보면 된다.
- 인텐트는 취하고자 하는 액션과 데이터를 정보로 품고 있다. (action+data)
- 정보를 품은 인텐트를 startActivity(), startActivityForResult() 메소드의 파라미터로 전달하면 인텐트가 갖고 있는 정보에 맞추어 액티비티가 전환된다.
- 서비스를 시작할때는 startService(), bindService()가 사용된다.
- 브로드 캐스팅을 시작할때는 broadcastIntent()가 사용된다.
@startActivity()와 startActivityForResult()의 차이
- startActivity()는 단순히 액티비티의 전환을 발생시키는 메소드로 매개변수로 인텐트만을 담는다.
- 실제 앱개발환경에서는 기존의 액티비티로 돌아와야 될 경우가 있다.
- 이때, 기존의 액티비티는 새로이 전환된 여러 액티비티 중 어떠한 액티비티인지 구분하여야 할 필요가 있다.
- startActivityForResult()와 setResult()를 통해 요청, 응답코드를 같이 전달함으로써 구분할 수 있다.
@액티비티 전환 프로세스
- <예시>
- 메인액티비티의 버튼을 클릭할 경우, 새로운 액티비티로 전환된다.
- 메인액티비티의 editText에 적힌 String을 인텐트의 부가데이터로 담는다.
- 새로운 액티비티는 받은 부가데이터를 자신의 textView로 저장한다.
- 다시 새로운 액티비티에서 버튼을 클릭할 경우 메인 액티비티로 돌아가며 정상적으로 반환되었다는 토스트 메시지가 출력된다.
- <xml 코드_main>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:gravity="center_horizontal">
<EditText
android:id="@+id/editText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="부가데이터에 담을 문장을 입력하시오" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="액티비티 전환"/>
</LinearLayout>
- <xml 코드_second>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".SecondActivity">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="부가데이터가 뿌려질 텍스트뷰"
android:textSize="25dp"/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="다시 메인액티비티로"/>
</LinearLayout>
- <자바 코드_main>
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
// 요청코드를 담은 태그
public static final int REQUEST_CODE_SECOND = 100;
// 객체 생성
EditText editText;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//객체 참조
editText = (EditText) findViewById(R.id.editText);
button = (Button) findViewById(R.id.button);
// 버튼 클릭리스너
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 메인->세컨드로 전환하는 인텐트 정의
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
// editText에 담긴 String을 getText()로 가져와 string에 담음
String string = editText.getText().toString();
// intent에 부가데이터를 구분할 태그 "TagName"에 string을 담음
intent.putExtra("TagName", string);
// 액티비티 전환(인텐트와 태그로 정의한 요청코드)
startActivityForResult(intent, REQUEST_CODE_SECOND);
}
});
}
// setResult()의 응답코드에 따라 다양한 이벤트를 설정할 수 있는 onActivityResult()
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// SecondActivity로 부터 응답받은 코드가 200이면 아래의 토스트 메시지 출력
if(resultCode==200){
Toast.makeText(getApplicationContext(), "정상적으로 반환", Toast.LENGTH_SHORT).show();
}
}
}
- <자바 코드_second>
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class SecondActivity extends AppCompatActivity {
// 객체 생성
TextView textView;
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
// 객체 참조
textView = (TextView) findViewById(R.id.textView);
button = (Button) findViewById(R.id.button);
// 인텐트를 받아오는 getIntent()를 이용하여 getIntent 정의
Intent getIntent = getIntent();
// 받아온 인텐트에 담긴 부가데이터를 받아옴(구분을 위한 키 입력)
String string = getIntent.getExtras().getString("TagName");
// 받아온 데이터를 textView에 뿌림
textView.setText(string);
// 버튼 클릭리스너
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 버튼 클릭시 원래의 액티비티로 돌아가는 인텐트 정의
Intent passedIntent = new Intent();
// 응답코드는 200으로 전함, 태그로 정의하지 않고 바로 숫자로 응답코드를 기입하여도 됨.
setResult(200, passedIntent);
// SecondActivity 소멸
finish();
}
});
}
}
- 자세한 설명은 코드 내 주석으로 처리하였음.
- second 액티비티에서 200이라는 응답코드를 메인 액티비티쪽으로 전달하였고, 메인액티비티의 onAcitivyResult()에서 해당 응답코드를 확인하고 토스트 메시지를 출력했음.
- <결과>
<메인 액티비티 레이아웃>
<세컨트 액티비티 레이아웃>
<메인액티비티의 editText에 담을 부가데이터를 입력하고 버튼을 클릭>
<부가데이터를 전달받은 second액티비티는 텍스트뷰에 해당 데이터를 뿌림>
<second액티비티에서 메인액티비티로 다시 돌아가는 버튼을 클릭시 onAcitivtyResult()메소드에 정의했던 토스트 메시지가 출력됨>
'▶개발 > Android' 카테고리의 다른 글
Android 공공 Open API를 retrofit2를 활용해서 사용하기. (0) | 2022.04.10 |
---|---|
안드로이드12 상태바/내비바 배경, 아이콘 색상 설정 (0) | 2022.04.07 |
[Android] 안드로이드 레이아웃:Relative Layout (0) | 2018.10.07 |
[Android] 안드로이드 레이아웃:Frame Layout (0) | 2018.10.03 |
[Android] 안드로이드 레이아웃:Linear Layout (0) | 2018.10.03 |