Android - Intent Callback
what is Intent?
인텐트는 뭘까?
먼저 Intent 를 알기전에
안드로이드 어플리케이션 구성하는 요소(컴포넌트)들을 알아보자.
1. Activity
2. Service
3. Broadcast Receiver
4. Content Provider
인텐트(Intent)란 이러한 어플리케이션 구성요소(컴포넌트) 간에
작업 수행을 위한 정보를 전달하는 역할을 한다.
우리는 보통 인텐트를 사용할땐 호출과 메시지 전달에 사용하는데
이번엔 Activity 간의 화면 전환 과 더불어
Intent Callback (data 주고받기) 를 해봤다.
먼저 activity_main 의 UI와 code 를 보자.
ui
editText 에 입력할 내용을 입력하고 이동버튼을 눌르게되면
다음화면에 입력한값이출력된다.
xml code
<?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"
android:weightSum="360"
android:orientation="vertical"
android:background="@android:color/white"
tools:context=".MainActivity">
<Space
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="150"
/>
<TextView
android:id="@+id/resultText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="30"
android:text="asdf"
android:textColor="@color/colorAccent"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:visibility="gone"/>
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="50"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:hint="전송할 값을 입력하세요"
android:textColorHint="@android:color/white"
android:textSize="20dp"
android:layout_gravity="center_vertical|center_horizontal"/>
<Button
android:id="@+id/moveButton"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginTop="100dp"
android:background="@color/colorPrimaryDark"
android:textColor="@android:color/white"
android:text="이동"
android:textSize="15dp"
android:elevation="20dp"
android:layout_weight="40"/>
</LinearLayout>
먼저 LinearLayout 을 사용했고선형 레이아웃으로 orientation을 vertical로 설정
그래서 수직으로 뷰가 구성된다. 그리고 weightSum 에 "360" 을 줬다.
<space> 로 공백을 "360"중의 "150" 만큼 준다.
<Textview> 를 하나만들어준다 먼저 이 Textview는 나중에 activity_second 에서 가져온 data를
보여주는 Textview 라고 보면된다."360"의 "30" 을 줬다.
그리고 android:layout_gravity="center_horizontal" 가로 중앙에 위치.
그리고 <EditText> "360" 중 "50" 만큼 줌.
그리고 이 EditText 은 전송할 값을 입력하는 EditText 이다.
android:hint="전송할 값을 입력하세요"
이렇게 hint를 사용하게 되면 글자를 입력하기전까진 보이지만 입력하면 보이지않는그러한 속성이다.
그리고 activity_second 으로 넘어가기위해 이동<Button> 하나를 만들어줬다.
자 이제 xml 코드 설명은 끝났다 이제 실질적 동작을하게 해주는 자바 소스를 보도록 하자.
Java code
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.TextView;
public class MainActivity extends AppCompatActivity {
private TextView resultText;
private EditText editText;
private Button moveButton;
private static final int REQUEST_CODE = 3000;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
setListeners();
}
private void init(){
resultText = findViewById(R.id.resultText);
editText = findViewById(R.id.editText);
moveButton = findViewById(R.id.moveButton);
}
private void setListeners(){
moveButton.setOnClickListener(v ->{
Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("value", editText.getText().toString());
startActivityForResult(intent, REQUEST_CODE);
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == REQUEST_CODE && resultCode == RESULT_OK){
String value2 = data.getStringExtra("value2");
resultText.setVisibility(View.VISIBLE);
resultText.setText(value2);
}
}
}
자여기선 Lambda Expression Code 가 이용된 코드이다.
먼저 각각 버튼의 아이디를 찾아줄 private init 메소드를 정의해준다.
그리고 setListeners 메소드는 Lambda Expression Code 이다.
moveButton.setOnClickListener (v ->{ 실제 동작할 코드 })
이렇게 식별자없이 실행 가능한 함수표현식이다.
실제 동작할 코드는 인텐트로 화면을 SecondActivity로 넘기는데
putExtra() 를 사용하여 data를 넘겨준다.
putExtra() = data를 전송할때 사용한다
putExtra()는 putExtra(key, value)
이런형식으로 사용된다.
그리고 Activity를 수신하기위해서
startActivityForResult() 를호출합니다.
private static final int REQUEST_CODE = 3000;
라는 코드를 써준이유는 startActivityForResult() 를호출를 하기위해서
정수 인자를 호출해야하기때문입니다.
그래서 REQUEST_CODE 에 정수 인자를 준 코드입니다.
그리고 밑에 @Override 된코드를 보면
뒤에 Second_Activity의 작업을 마치고 돌아오면, MainActivity 의 onActivityResult()
를 호출합니다.
이 method는 세 가지 인수를 포함한다.
이코드는 인텐트에 대한 결과를 처리하는 방법
이라고 볼수있다.
if(requestCode == REQUEST_CODE && requestCode == REQUEST_CODE){
String value2 = data.getStringExtra("value2");
이 코드를 보게되면
그리고 이코드는 value2 의 data를 받아와서 String 형태로 담는다.
resultText.setVisibility(View.VISIBLE);
resultText.setText(value2);
value2의 내용을 보여주는 코드로 볼수있다.
setVisibility(View.VISIBLE)는
View를 숨기고, 감추고, 보여지게
해주는 코드이다
view.setVisibility(View.VISIBLE); // View를 보여 준다.
라고 이해하면 될것같다.
이제 두번째 화면의 UI를 보자
SecondActivity UI
첫번째 화면에서 입력한 값이 출력되있는걸 볼수있는 화면이다.
그리고 여기서 또 editText1에 또 내용을 입력한뒤 이동을
눌르게되면 첫번째 화면에 TextView에 두번째 화면에서
입력된 값이 출력되는 걸 볼수있다.
자이제 xml 코드를 보자.
<?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"
android:weightSum="360"
android:orientation="vertical"
android:background="@android:color/white"
tools:context=".SecondActivity"
>
<Space
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="150"
/>
<TextView
android:id="@+id/resultText1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="30"
android:text="asdf"
android:textColor="@color/colorAccent"
android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
android:gravity="center"
android:layout_gravity="center_horizontal"
android:visibility="visible"/>
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="50"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:hint="전송할 값을 입력하세요"
android:textColorHint="@android:color/white"
android:textSize="20dp"
android:layout_gravity="center_vertical|center_horizontal"/>
<Button
android:id="@+id/finishButton"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:layout_marginTop="100dp"
android:background="@color/colorPrimaryDark"
android:textColor="@android:color/white"
android:onClick="moveButton1"
android:text="이동"
android:textSize="15dp"
android:elevation="20dp"
android:layout_weight="40"/>
</LinearLayout>
이 xml 코드는 첫번째 xml 코드와 같은코드이다
하지만 각 위젯의 id 값은 다르게줬다.
Java code 를보자
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class SecondActivity extends AppCompatActivity {
private TextView resultText1;
private EditText editText1;
private Button finishButton;
private String value;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
init();
setListeners();
}
private void init(){
resultText1 = findViewById(R.id.resultText1);
editText1 = findViewById(R.id.editText1);
finishButton = findViewById(R.id.finishButton);
value = getIntent().getStringExtra("value");
resultText1.setText(value);
}
private void setListeners(){
finishButton.setOnClickListener(v ->{
Intent intent = new Intent();
intent.putExtra("value2", editText1.getText().toString());
setResult(RESULT_OK, intent);
finish();
});
}
}
onCreate() 코드를 보면
init() 와 setListeners() 를 호출하는데
init()를 보면
각 위젯의 id를 찾는 코드가 보이고
value = getIntent().getStringExtra("value");
resultText1.setText(value);
첫번째 화면에서 입력한 data를
getStringExtra()를 이용해 getStringExtra(key) 방식을 통해서 string을 받을수 있습니다.
그리고 받아온 data를
resultText1에 출력해줍니다
이 소스를 보면 두번째 화면에 첫번째 화면에 입력했던 값을 출력해주는
코드라는걸 알수있습니다.
그리고 setListeners()를 보면
이번에도 람다식(Lambda Expression Code)이 적용되었다.
여기선 value2의 data를 입력해주는 코드이다.
위에 첫번째 자바코드에서 value2의 data를 받아오는 코드가있을것이다.
그리고 두번째 화면에서 data 입력한뒤 finshButton을
누르게 되면 첫번째 화면으로 이동하게 되면서 입력한 data를
출력해주는 앱이다.
이앱은 Intent Callback 의 예제라고 볼수있다.
이번 수업에선 이해를 하려고 노력을 했다.
처음보는 방식의 코드도 있었고
새로운 지식도 많이 얻은 수업이었던것 같다.
좀 더 열심히 해야겠다.
'Android > Android ( JAVA )' 카테고리의 다른 글
Android (여섯번째 수업 - RecyclerView) (0) | 2018.09.17 |
---|---|
Android (다섯번째 수업 - Custom ListView 와 adapter pattern) (0) | 2018.08.25 |
Android (네번째 수업 - Glide , Ratingbar) (0) | 2018.08.14 |
Android (세번째 수업 - 안드로이드 Design Support Library( Snackbar, AlertDialog )) (0) | 2018.08.09 |
Android (첫번째 수업 - 기본구조와 레이아웃) (2) | 2018.07.14 |