티스토리 뷰

학교공부/안드로이드

chaper 10 (액티비티와 인텐트)

날따라해봐요요롷게 2021. 4. 22. 00:06

- 액티비티와 인텐트의 기본

- 앤티비티와 인텐트의 응용

 

 예제(10-11, 10-12, 10-13), 실습10-3,

 

- 액티비티 : 화면을 구성하는 가장 기본적인 컴포넌트 / 액티비티는 휴대폰에 나타나는 화면 하나하나를 말한다.

- 인텐트 : 안드로이드 4대 컴포넌트가 서로 데이터를 주고받기 위한 메시지 객체이다.

인텐트는 명시적 인텐트 / 암시적 인텐트로 구분된다.

 

 - 명시적 인텐트 : 다른 액티비티의 이름을 명확히 지정할 때 사용하는 방법

Intent intent = new Intent(getApplicationContext(), 액티비티.class);

startActivity(intent);

 : Intent() 생성자의 두 번째 파라미터에서는 액티비티 클래스를 넘긴다. 그리고 startActivity(intent) 로 생성한 인텐트를 넘겨서 지정한 액티비티를 실행. => 명시적 인텐트는 사용자가 새로운 액티비티를 직접 생성하고 호출할 때 사용된다.

 

명시적 인텐트가 일어나는 과정을 살펴보자

참조 : https://developer.android.com/guide/components/intents-filters?hl=ko

Activity A 에서 putExtra() 메소드를 이용하여 필요한 데이터를 intent에 넣은 다음 startActivity() 로 인텐트를 다른 액티비티로 넘긴다. 그리고 인텐트를 받은 액티비티에서는 getStringExtra(), getIntExtra(), getBooleanExtra() 의 메소드로 넘어온 데이터에 접근한다.

 

##예제10-11

 

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("휴대폰 선호도 투표");

        final int voteCount[] = new int[3];
        for(int i = 0; i<3; i++){
            voteCount[i] = 0;
        }

        ImageView image[] = new ImageView[3];
        Integer imageId[] = {R.id.iv1, R.id.iv2, R.id.iv3};

        final String imgName[] = {"휴대폰", "아이패드", "아이워치"};

- 그림을 클릭할 때마다 투표수를 저장할 크기에 맞는 배열을 선언하고 0으로 초기화

 : voteCount[] 배열 선언 후 0으로 초기화

- 이미지뷰 위젯을 저장한 크기에 맞는 배열을 선언

 : ImageView image[] 배열 선언

- 이미지뷰 위젯의 id를 저장한 배열을 선언

 : Integer imageId[] 배열 선언 후 위젯의 id 값 저장.

- 그림의 이름을 저장한 크기에 맞는 배열을 선언

 : String imgName[] 그림의 이름을 저장하여 초기화.

 

##예제10-12 - 위의 onCreate() 메서드를 이어서 작성

 

for(int i =0; i<imageId.length; i++){
            final int index; // 인덱스 무조건 필요!
            index = i;
            image[index] = (ImageView)findViewById(imageId[index]);
            image[index].setOnClickListener(new View.OnClickListener(){
                public void onClick(View v){
                    voteCount[index]++;
                    Toast.makeText(getApplicationContext(),
                            imgName[index] + " : 총 " + voteCount[index] + " 표 ",
                                    Toast.LENGTH_SHORT).show();
                }
            });
        }

- 각 이미지뷰에 대해 클릭 이벤트 리스너를 생산한다. 반복문을 사용

 : 넣은 이미지 아이디 크기만큼 반복문을 사용한다. for(int i=0; i<ImageId.length; i++)/ 배열에 맞는 이미지 위젯의 id를 지정하고 이미지 클릭 시 setOnClickListener 이벤트가 발생한다

- 이미지를 클릭하면 각 이미지의 투표수가 증가

 : onClick메서드가 발생하면 voteCount 배열의 인덱스의 숫자를 증가시켜준다. =>voteCount[index]++;

- 이미지를 클릭할 때마다 해당 이미지의 이름과 누적된 투표수도 토스트메시지로 보여줌

 : Toast.makeText(getApplicationContext(), imgName[index] + ~~~ , Toase.LENGTH_SHORT).show();

토스트를 만들어서 전달할 메시지를 작성하고 show() 한다.

##예제10-13 - 위의 onCreate() 메서드 이어서 작성 

Button btnFinish = (Button)findViewById(R.id.btnResult);
        btnFinish.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                Intent intent = new Intent(getApplicationContext(), ResultActivity.class);
                intent.putExtra("VoteCount", voteCount);
                intent.putExtra("ImageName", imgName);
                startActivity(intent);
            }
        });

 - 인텐트를 생성하고, 인텐트에 투표수 배열과 그림 이름 배열을 넣은 다음 결과 액티비티를 호출

 : finish 버튼을 누르면 이벤트 발생 -> Intent intent = new Intent(getApplicationContext(), 데이터를 보낼 액티비티.class) intent 생성 ->putExtra() 메서드를 사용하여 정수형 voteCount 배열을 VoteCount라는 이름으로 인텐트에 넣는다. 문자열 배열인 imgName 데이터를 ImageName 이름으로 인텐트에 넣는다. -> 명시적으로 지정한 액티비티에서는 getStringArrayExtra() 메소드로 받는다.

##예제10-14 - 명시한 서브 액티비티 자바코드

 @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.result);
        setTitle("투표 결과");

        Intent intent = getIntent();
        int[] voteResult = intent.getIntArrayExtra("VoteCount");
        String[] imageName = intent.getStringArrayExtra("ImageName");

        TextView tv[] = new TextView[imageName.length];
        RatingBar rbar[] = new RatingBar[imageName.length];

        Integer tvID[] = {R.id.tv1,R.id.tv2,R.id.tv3};
        Integer rbarID[] = {R.id.rbar1,R.id.rbar2,R.id.rbar3};

        for(int i =0; i<voteResult.length; i++){
            tv[i] = (TextView)findViewById(tvID[i]);
            rbar[i] = (RatingBar) findViewById(rbarID[i]);
        }
        for(int i =0; i<voteResult.length; i++){
            tv[i].setText(imageName[i]);
            rbar[i].setRating((float) voteResult[i]);
        }

        Button btnReturn = (Button)findViewById(R.id.btnReturn);
        btnReturn.setOnClickListener(new View.OnClickListener(){
            public void onClick(View v){
                finish();
            }
        });
    }

- 메인 액티비티에서 보낸 인텐트를 받고, 넘겨받은 투표 결과 배열과 그림 이름 배열을 저장한다.

 : 서브 액티비티에서는 메인 액티비티에서 넘겨진 intent를 받기 위해 getIntent로 받는다.

Intent intent = getIntent(); 로 생성

int[] voteResult = intent.getIntArrayExtra("VoteCount");

String[] imageName= intent.getStringArrayExtra("ImageName");

각각 인텐트로 넘어온 배열의 데이터를 받을 배열을 생성한 후 get~~Extra 메서드를 이용해 넘어온 이름의 데이터를 받는다.

 

 

- 양방향 액티비티 

 : 위에서는 단방향 액티비티로 메인 액티비티에서 인텐트로 넘겨준 데이트를 서브 액티비티에서 받기만 하였다.

하지만 이제는 양방향 액티비티를 이용하여 두 액티비티가 인텐트로 데이터를 주고 받아보자.

참조 : https://hijjang2.tistory.com/97

main 액티비티에서 putExtra 로 인텐트에 데이터를 넣는 것은 똑같다. 하지만 second 액티비티에서 데이터를 돌려받으려면 액티비티를 호출할 때 startActivity() 가 아니고 startActivityForResult() 메소드를 사용해야 한다. 또한 second 액티비티에서 finish() 메소드가 일어나기 전에 putExtra 메소드를 이용해 데이터를 intent 에 넣고setResult() 메소드로 돌려준다. main 액티비티에서는 onActivityResult() 메소드를 오버라이딩 하고 오버라이딩된 메소드 안에서 getExtra() 로 돌려 받은 데이터를 사용한다.

 

- 암시적 인텐트

: 약속된 액션을 지정하여 안드로이드에서 제공하는 기존 응용 프로그램을 실행하는 것이다. 

ex) 전화번호를 인텐트로 넘긴 후에 전화 걸기 응용 프로그램이 실행된다.

 

Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:/119"));

startActivity(intent);

 

지정한 액션을 사용하기 위해서 예를 들어 전화걸기를 사용하기 위해서는 AndroidManifest.xml 의 <application 에 권한을 추가해야한다.

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

 

 

- 액티비티 생명주기

참조 : 

프로그램이 실행되면onCreate() -> onStart() -> onResume() 메소드가 수행되고 main 액티비티 화면이 나온다.

이것이 실행 상태이다. 이 상태에서 메인 액티비티를 끝내면 onPause()-> onStop()-> onDestroy() 메소드가 실행되고 프로그램이 종료된다. 중간에 다른 프로그램을 실행하면 onPause() -> onStop() 가 차례대로 실행되고 프로그램이 중지된다. 또 다른 액티비티의 사용을 종료하면onRestart() -> onStart() -> onResume() 메소드가 수행되고 다시 메인 액티비티 화면이 나타난다.

 

 

##실습10-3 - 액티비티의 생명주기 확인하기

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setTitle("액티비티 테스트 예제");
        android.util.Log.i("액티비티 테스트", "onCreate()"); //중요!! 실행했다는 로그를 로그캣에 남기는 코드

        Button btnDial = (Button)findViewById(R.id.btnDial);
        btnDial.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);
            }
        });

        Button btnFinish = (Button)findViewById(R.id.btnFinish);
        btnFinish.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                finish();
            }
        });
        
    }

- <전화걸기> 버튼을 클릭하면 다른 액티비티인 전화걸기 화면이 나오게한다.

- <끝내기> 버튼을 클릭하면 메인 액티비티를 종료한다.

onCreate() 메소드를 실행했다는 로그를 로그캣에 남기기 위해 android.util.Log.i() 메소드의 첫 번째 파라미터에는 구분하기 위한 태그, 두 번째 파라미터에는 로그에 남길 문자를 넣는다.

 - Intent intent = new Intent(Intent.ACTION_DIAL, uri); - > 암시적 인텐트를 사용하여 지정한 액션이 일어나게 구현

 

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

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

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

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

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

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

위의 메소드들을 오버라이딩 하여 액티비티의 생명주기가 어떻게 이루어 지는지 로그로 남긴다.

 

## 연습문제1

안드로이드 컴포넌트 중 콘텐트 프로바이더는 응용 프로그램 사이에 데이터를 공유하기 위한 용도로, 브로드캐스트 리시버는 여러 응용 프로그램이나 장치에 메시지를 전달하기 위한 용도로,  서비스는 백그라운드에서 작동하기 위한 용도로, 액티비티는 화면을 구성하는 용도로 사용된다.

 

## 연습문제2

명시적 인텐트에서 데이터를 전달할 때, 메인 액티비티에서 putExtra() 메소드로 인텐트에 데이터를 넣고, startActivity() 메서드로 인텐트를 서브 액티비티에 넘긴다. 서브 액티비티에서는 받은 데이터에 getIntExtra(), getStringExtra(), getBooleanExtra() 메서드로 접근한다.

 

## 연습문제3

양방향 액티비티에서 메인 액티비티는 startActivityForResult() 메소드로 서브 액티비티를 호출하고, 서브 액티비티는 setResult() 메소드로 결과를 돌려준다.

 

## 연습문제4

액티비티가 정상적으로 시작하고 종료할 때 호출되는 Activity 클래스의 메소드를 차례대로 쓰시오.

onCtreate(), onStart(), onResume(), onPause, onStop(), onRestart(), onStart(), onResume, onPause, onStop(), onDestroy()

'학교공부 > 안드로이드' 카테고리의 다른 글

안드로이드(1)  (0) 2021.10.15
chapter - 14(서비스와 브로드캐스트 리시버)  (0) 2021.05.15
chapter 8 (파일처리)  (0) 2021.04.21
chapter 7 (메뉴와 대화상자)  (0) 2021.04.21
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함