startActivityForResult, startActivityResult in Android Studio
1. activity_main.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?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">
<TextView
android:id="@+id/tv_main"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="textView"
android:textSize="30sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/btn_main"
android:text="GO"/>
</LinearLayout>
|
cs |
2. activity_sub.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/et_sub"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Main으로 보낼 값을 입력하시오."/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="종료"
android:id="@+id/btn_sub"/>
</LinearLayout>
|
cs |
startActivityForResult() 함수를 통해서 띄울 activity의 layout을 만들어준다.
3. MainActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
package com.example.startactivityforresultexample;
import ...
public class MainActivity extends AppCompatActivity {
private TextView textView;
private Button button;
private static final int REQUEST_CODE = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.tv_main);
button = (Button)findViewById(R.id.btn_main);
button.setOnClickListener(v -> {
Intent intent = new Intent(getApplicationContext(), SubActivity.class);
startActivityForResult(intent, REQUEST_CODE);
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable @org.jetbrains.annotations.Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Toast.makeText(getApplicationContext(), "수신 성공", Toast.LENGTH_SHORT);
} else {
Toast.makeText(getApplicationContext(), "수신 실패", Toast.LENGTH_SHORT);
}
if (requestCode == REQUEST_CODE) {
String resultText = data.getStringExtra("text");
textView.setText(resultText);
}
}
}
|
cs |
16~17 - SubActivity를 띄우기 위한 intent를 만들고 startActivityForResult() 함수를 이용해서 SubActivity를 띄운다.
21~32 - onActivityResult()를 통해서 SubActivity를 끝내고 실행되는 이벤트를 설정할 수 있다.
23~27 - SubActivity.java에서 설정할 resultCode를 이용해서 수신 결과에 대해서 판단한다.
28~31 - 위에서 startActivityForResult()함수의 매개변수로 전달했던 REQUEST_CODE를 이용해서 result가 어떤 Activity에 의한 것인지 확실히 판단하는 듯하다. 그리고 data.getStringExtra(String name)로 SubActivity.java에서 putExtra(String name, value)를 통해서 저장했던 정보에 접근할 수 있다.
4. SubActivity.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package com.example.startactivityforresultexample;
import ...
public class SubActivity extends Activity {
private EditText editText;
private Button button;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sub);
editText = (EditText)findViewById(R.id.et_sub);
button = (Button)findViewById(R.id.btn_sub);
button.setOnClickListener(v -> {
Intent intent = new Intent();
intent.putExtra("text", editText.getText().toString()); //intent에 정보 저장
setResult(RESULT_OK, intent); //결과 값 설정
finish(); //현재 액티비티 종료
});
}
}
|
cs |
15~16 - intent를 만들고 putExtra(String name, value)를 통해서 전달할 정보를 저장한다.
17 - setResult(int resultCode, Intent intent)를 통해서 결과 값을 설정한다.
18 - finish()로 현재 activity를 종료한다.
5. AndroidManifest.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.startactivityforresultexample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.StartActivityForResultExample">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SubActivity"/>
</application>
</manifest>
|
cs |
17 - 위처럼 activity를 등록한다.
* startActivityResult
https://developer.android.com/training/basics/intents/result?hl=ko
활동에서 결과 가져오기 | Android 개발자 | Android Developers
활동에서 결과 가져오기 개발자 앱 내의 활동이든 다른 앱의 활동이든 다른 활동을 시작하는 것이 단방향 작업일 필요는 없습니다. 다른 활동을 시작하고 다시 결과를 받을 수도 있습니다. 예를
developer.android.com
startActivityForResult(), onActivityResult()를 사용하는 것을 권장하지 않는다고 한다.
그리고 이제 startActivityForResult()를 startActivityResult.launch(intent)으로 바꾸고
onActivityResult()를 아래와 같이 바꾸어야한다.
1
2
3
4
5
6
7
8
9
10
11
12
|
ActivityResultLauncher<Intent> startActivityResult = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback<ActivityResult>() {
@Override
public void onActivityResult(ActivityResult result) {
if (result.getResultCode() == Activity.RESULT_OK) {
...
}
}
});
|
cs |
더 자세한 것은 위의 링크의 페이지에서 찾을 수 있다.