mojo's Blog

액티비티와 인텐트 응용 본문

Android

액티비티와 인텐트 응용

_mojo_ 2021. 9. 4. 16:47
양방향 액티비티

 

메인 액티비티에서 세컨트 액티비티로 데이터를 넘긴 후에 다시 세컨드 액티비티에서 메인 액티비티로 데이터를 돌려주는 경우가 있다.

매인 액티비티에서 putExtra()로 인텐트에 데이터를 넣는 것은 동일하지만, 세컨트 액티비티에서 데이터를 돌려받으려면 액티비티를 호출할 때 startActivityForResult() 메소드를 사용해야 한다.

그리고 세컨트 액티비티에서 finish() 로 끝내기 전에 메인 액티비티에 돌려줄 인텐트를 생성하여 putExtra()로 데이터를 넣은 다음 setResult()로 돌려준다.

또한 메인 액티비티에서는 onActivityResult() 메소드를 오버라이딩하고 오버라이딩된 메소드 안에서 getExtra() 메소드로 돌려받은 데이터를 사용한다.

 

무슨 소리인지 모르겠다면 직접 코드를 구현해서 익혀보도록 한다.

 

연습하기 ) 양방향 데이터 전달 구현하기

 

activity_main.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:orientation="vertical">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edit1"
        android:hint="숫자1"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edit2"
        android:hint="숫자2"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="더하기"
        android:id="@+id/btn1"/>

</LinearLayout>

 

second.xml Code

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="돌아가기"
        android:id="@+id/btnReturn"/>

</LinearLayout>

 

MainActivity.java Code

 

public class MainActivity extends AppCompatActivity {
    EditText edit1, edit2;
    Button btn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("연습하기");

        edit1 = (EditText)findViewById(R.id.edit1);
        edit2 = (EditText)findViewById(R.id.edit2);
        btn = (Button)findViewById(R.id.btn1);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int x = Integer.parseInt(edit1.getText().toString());
                int y = Integer.parseInt(edit2.getText().toString());
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                intent.putExtra("Value", (x+y));
                startActivityForResult(intent, 0);
            }
        });
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode == RESULT_OK){
            int hap = data.getIntExtra("Value",0);
            Toast.makeText(getApplicationContext(), "합계 : "+hap,Toast.LENGTH_SHORT).show();
        }
    }
}

 

SecondActivity.java Code

 

public class SecondActivity extends AppCompatActivity {
    Button btn;

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        setTitle("연습");

        Intent inIntent = getIntent();
        final int hapValue = inIntent.getIntExtra("Value",0);

        btn = (Button)findViewById(R.id.btnReturn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent outIntent = new Intent(getApplicationContext(), SecondActivity.class);
                outIntent.putExtra("Value",hapValue);
                setResult(RESULT_OK, outIntent);
                finish();
            }
        });
    }
}

 

 

연습하기 ) 두 수를 입력하고 사칙연산 라디오버튼을 선택한 후 <계산하기>를 클릭하면 다음 화면에서 계산을 완료하여 값을 돌려받도록 구현하기

 

activity_main.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:padding="15dp"
    android:orientation="vertical">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edit1"
        android:hint="숫자1"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edit2"
        android:hint="숫자2"/>

    <RadioGroup
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/rGroup">
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rBtn1"
            android:text="더하기"/>
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rBtn2"
            android:text="빼기"/>
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rBtn3"
            android:text="곱하기"/>
        <RadioButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/rBtn4"
            android:text="나누기"/>
    </RadioGroup>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="계산하기"
        android:id="@+id/btn1"/>

</LinearLayout>

 

second.xml

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="돌아가기"
        android:id="@+id/btnReturn"/>

</LinearLayout>

 

MainActivity.java Code

 

public class MainActivity extends AppCompatActivity {
    EditText edit1, edit2;
    Button btn;
    RadioGroup rGroup;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("연습하기");

        edit1 = (EditText)findViewById(R.id.edit1);
        edit2 = (EditText)findViewById(R.id.edit2);
        btn = (Button)findViewById(R.id.btn1);
        rGroup = (RadioGroup)findViewById(R.id.rGroup);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
                intent.putExtra("value1", Integer.parseInt(edit1.getText().toString()));
                intent.putExtra("value2", Integer.parseInt(edit2.getText().toString()));

                switch(rGroup.getCheckedRadioButtonId()){
                    case R.id.rBtn1:
                        intent.putExtra("operation", 1);
                        break;
                    case R.id.rBtn2:
                        intent.putExtra("operation", 2);
                        break;
                    case R.id.rBtn3:
                        intent.putExtra("operation", 3);
                        break;
                    case R.id.rBtn4:
                        intent.putExtra("operation", 4);
                }

                startActivityForResult(intent, 0);
            }
        });
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        if(resultCode == RESULT_OK){
            int result = data.getIntExtra("result",0);
            if (data.getBooleanExtra("operation", true))
                Toast.makeText(getApplicationContext(), "결과 : " + result,Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(getApplicationContext(), "0으로 나누실 수 없습니다!",Toast.LENGTH_SHORT).show();
        }
    }
}

 

SecondActivity.java Code

 

public class SecondActivity extends AppCompatActivity {
    Button btn;

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second);
        setTitle("연습");

        Intent inIntent = getIntent();
        final int operation = inIntent.getIntExtra("operation",0);
        int result = 0, divOp = 0;

        switch(operation){
            case 1:
                result = inIntent.getIntExtra("value1", 0) + inIntent.getIntExtra("value2",0);
                break;
            case 2:
                result = inIntent.getIntExtra("value1", 0) - inIntent.getIntExtra("value2",0);
                break;
            case 3:
                result = inIntent.getIntExtra("value1", 0) * inIntent.getIntExtra("value2",0);
                break;
            case 4:
                if(inIntent.getIntExtra("value2",0) != 0)
                    result = inIntent.getIntExtra("value1", 0) / inIntent.getIntExtra("value2",0);
                else divOp = 1;
                break;
        }

        final int Result = result, DivOp = divOp;
        btn = (Button)findViewById(R.id.btnReturn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent outIntent = new Intent(getApplicationContext(), SecondActivity.class);
                outIntent.putExtra("result", Result);
                if(DivOp == 0) outIntent.putExtra("operation", true);
                else outIntent.putExtra("operation", false);
                setResult(RESULT_OK, outIntent);
                finish();
            }
        });
    }
}

 

 

암시적 인텐트

 

명시적 인텐트의 개념이 두 액티비티를 사용자가 직접 생성하고 코딩하는 것이라면, 암시적 인텐트(implicit intent)는 약속된 액션을 지정하여 안드로이드에서 제공하는 기존 응용 프로그램을 실행하는 것이다.

예를 들어서 전화번호를 인텐트로 넘긴 후에 전화 걸기 응용 프로그램이 실행되는 것과 같다.

 

먼저 AndroidManifest.xml에 권한을 추가해야 한다.

<uses-permission android:name="android.permission.CALL_PHONE"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

 

activity_main.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:padding="15dp"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="전화 걸기"
        android:id="@+id/btn1"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="홈페이지 열기"
        android:id="@+id/btn2"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="구글 맵 열기"
        android:id="@+id/btn3"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="구글 검색하기"
        android:id="@+id/btn4"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="문자 보내기"
        android:id="@+id/btn5"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="사진 찍기"
        android:id="@+id/btn6"/>

</LinearLayout>

 

MainActivity.java Code

 

public class MainActivity extends AppCompatActivity {
    Button btn1, btn2, btn3, btn4, btn5, btn6;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("연습하기");

        btn1 = (Button)findViewById(R.id.btn1);
        btn2 = (Button)findViewById(R.id.btn2);
        btn3 = (Button)findViewById(R.id.btn3);
        btn4 = (Button)findViewById(R.id.btn4);
        btn5 = (Button)findViewById(R.id.btn5);
        btn6 = (Button)findViewById(R.id.btn6);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Uri uri = Uri.parse("tel:01012345678");
                Intent intent = new Intent(Intent.ACTION_DIAL, uri);
                startActivity(intent);
            }
        });

        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Uri uri = Uri.parse("http://www.naver.com");
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
            }
        });

        btn3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Uri uri = Uri.parse("https://maps.google.com/maps?q="+37.554264+","+126.913598);
                Intent intent = new Intent(Intent.ACTION_VIEW, uri);
                startActivity(intent);
            }
        });

        btn4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Intent.ACTION_WEB_SEARCH);
                intent.putExtra(SearchManager.QUERY, "Android");
                startActivity(intent);
            }
        });

        btn5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });

        btn6.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
    }
}

 

 

 

액티비티 생명주기

 

안드로이드 응용 프로그램은 PC용과 달리 화면이 작으므로 동시에 여러 개의 액티비티가 나올 수 없다. 

즉 응용 프로그램이 여러 개의 액티비티로 작성되어 있다면 앞에 나오는 화면 하나만 활성화된 상태이고 나머지는 모두 비활성화된 상태가 된다. 

비활성화된 액티비티가 다시 앞으로 나오면 앞에 있던 액티비티는 비활성화가 된다.

 

액티비티의 생명주기는 액티비티의 생성부터 소멸까지의 주기를 말한다.

응용 프로그램이 시작되면 onCreate(), onStart(), onResume() 메소드가 수행되고 메인 액티비티 화면이 나온다.

이것이 메인 액티비티의 실행 상태이다. 

이 상태에서 메인 액티비티를 끝내면 onPause(), onStop(), onDestroy() 메소드가 차례로 수행되고 응용 프로그램이 종료된다.

만약 다른 액티비티를 요청하면 onPause(), onStop() 메소드가 수행되고 메인 액티비티가 중지되며 다른 액티비티 화면이 나온다.

또 다른 액티비티의 사용을 종료하면 onRestart(), onStart(), onResume() 메소드가 수행되고 다시 메인 액티비티 화면이 나온다.

 

연습하기 ) 로그캣을 이용하여 액티비티 생명주기 확인하는 코드 작성하기

 

먼저 설정해야 할것은 [View]-[Tool Windos]-[Logcat]을 선택하거나 아래쪽 [Logcat] 탭을 선택하면 로그캣 화면이 보인다.

 

 

Regex 오른쪽에 있는걸 누르고 "Edit Filter Configuration" 을 선택하여 Filter Name에 적당한 이름을 넣고 Log Tag 에 "액티비티를 입력하고 <OK> 버튼을 클릭한다.

 

이제 "액티비티" 필터를 클릭하여 각 단계마다 로그캣을 확인하여 동작하는지를 확인한다.

 

 

activity_main.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:padding="15dp"
    android:orientation="vertical">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="전화 걸기"
        android:id="@+id/btn1"/>
    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="끝내기"
        android:id="@+id/btn2"/>

</LinearLayout>

 

MainActivity.java Code

 

public class MainActivity extends AppCompatActivity {
    Button btn1, btn2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("연습하기");
        android.util.Log.i("액티비티 테스트", "onCreate()");

        btn1 = (Button)findViewById(R.id.btn1);
        btn2 = (Button)findViewById(R.id.btn2);

        btn1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Uri uri = Uri.parse("tel:01012345678");
                Intent intent = new Intent(Intent.ACTION_DIAL, uri);
                startActivity(intent);
            }
        });

        btn2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
    }

    protected void onStop(){
        super.onStop();
        android.util.Log.i("액티비티 테스트", "onStop()");
    }

    protected void onStart(){
        super.onStart();
        android.util.Log.i("액티비티 테스트", "onStart()");
    }

    protected void onResume(){
        super.onResume();
        android.util.Log.i("액티비티 테스트", "onResume()");
    }

    protected void onRestart(){
        super.onRestart();
        android.util.Log.i("액티비티 테스트", "onRestart()");
    }

    protected void onPause(){
        super.onPause();
        android.util.Log.i("액티비티 테스트", "onPause()");
    }

    protected void onDestroy(){
        super.onDestroy();
        android.util.Log.i("액티비티 테스트", "onDestroy()");
    }
}

 

Comments