Android App

startActivityForResult, startActivityResult in Android Studio

YunSeong 2021. 9. 18. 23:59
728x90
반응형

https://youtu.be/YxwYmTyh7gg

 

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

더 자세한 것은 위의 링크의 페이지에서 찾을 수 있다.

 

 

728x90
반응형