티스토리 뷰
- 액티비티와 인텐트의 기본
- 앤티비티와 인텐트의 응용
예제(10-11, 10-12, 10-13), 실습10-3,
- 액티비티 : 화면을 구성하는 가장 기본적인 컴포넌트 / 액티비티는 휴대폰에 나타나는 화면 하나하나를 말한다.
- 인텐트 : 안드로이드 4대 컴포넌트가 서로 데이터를 주고받기 위한 메시지 객체이다.
인텐트는 명시적 인텐트 / 암시적 인텐트로 구분된다.
- 명시적 인텐트 : 다른 액티비티의 이름을 명확히 지정할 때 사용하는 방법
Intent intent = new Intent(getApplicationContext(), 액티비티.class);
startActivity(intent);
: Intent() 생성자의 두 번째 파라미터에서는 액티비티 클래스를 넘긴다. 그리고 startActivity(intent) 로 생성한 인텐트를 넘겨서 지정한 액티비티를 실행. => 명시적 인텐트는 사용자가 새로운 액티비티를 직접 생성하고 호출할 때 사용된다.
명시적 인텐트가 일어나는 과정을 살펴보자
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 메서드를 이용해 넘어온 이름의 데이터를 받는다.
- 양방향 액티비티
: 위에서는 단방향 액티비티로 메인 액티비티에서 인텐트로 넘겨준 데이트를 서브 액티비티에서 받기만 하였다.
하지만 이제는 양방향 액티비티를 이용하여 두 액티비티가 인텐트로 데이터를 주고 받아보자.
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 |