Android Programming

[Mobile Programming] 액티비티와 인텐트

gangintheremark 2021. 11. 10. 23:02
728x90

액티비티

사용자 인터페이스 내용을 담은 하나의 화면

  • XMl 파일 추가 : 일반적으로 액티비티 하나당 XML 파일 하나
  • JAVA 파일 추가
    • Activity 에서 상속받은 클래스를 하나 만들어 새로운 액티비티의 자바 파일로 사용
    • 자바 파일에서 setContentView(R.layout.second)와 같이 xml파일을 액티비티에 연결
    public class SecondActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedinstanceState) {

            super.onCreate(savedlnstanceState);
            setContentView(R.layout.second);  // second.xml 로 연결
        }
    }

액티비티 스택

  • 액티비티들 간의 이동을 관리
  • 스택 → task(애플리케이션) 단위로 하나씩 주어짐
  • 앱에서는 새로운 액티비티의 호출과 액티비티의 종료 발생
  • 새로운 액티비티가 호출될 때마다 스택에 차례대로 저장
  • 하나의 task를 안드로이드 운영체제가 만듦
  • 액티비티가 종료되면 스택에서 제거, 다음 액티비티로 제어가 넘어감

새로운 액티비티로의 이동
→ 위젯과 연동된 이벤트
→ startActivity(intent)
→ startActivityForResult(intent)

 

현 액티비티의 종료
→ finish(); 함수 호출
→ back 버튼;


인텐트

  • 액티비티들 상호간 데이터를 주고 받기 위한 메시지 객체
  • 인텐트에 전환될 액티비티 정보, 넘겨줄 데이터 값 저장

명시적 인텐트

  • "애플리케이션 A의 컴포넌트 B를 구동 시켜라" 같이 명확하게 지정
  • 이름을 아는 액티비티들 간의 이동에 주로 사용
  • 주로 개발자가 만드는 하나의 애플리케이션 내에서 사용 : 액티비티들 간의 이동에 사용

암시적 인텐트

  • 내가 만든 애플리케이션에서 안드로이드가 제공하는 일반적인 컴포넌트를 호출할 때 사용

명시적인 인텐트

실행하고자 하는 액티비티의 이름을 명시적으로 적음

  • 메인 액티비티에서 인텐트에 액티비티에 대한 정보 넘김 → PutExtra();
  • 인텐트를 통해 넘어온 데이터 처리 → getIntExtra();
 Intent intent = new Intent(this, NextActivity.class);
        intent.putExtra(name, value);
        startActivity(intent);

명시적 인텐트

양방향 액티비티와 데이터 전달

  • 메인 액티비티에서 두 번째 액티비티로 데이터를 넘긴 후에 다시 돌려주는 경우
  • 액티비티를 호출한 이후 돌려 받는 데이터를 위해 → onActivityResult() 함수를 통해 값을 돌려받음

// 서브 액티비티를 시작
Intent intent = new Intent(MainActivity.this, SubActivity.class);
startActivityForResult(intent, COMMAND);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
... // 여기서 값을 전달받음
}

실습

버튼 클릭 시, 해당 액티비티 화면으로 전환

// MainActivity.java 
       Button btn = (Button) findViewById(R.id.button);
       btn1.setOnClickListener(new View.OnClickListener() {
               @Override
            public void onClick(View v) {
                 Intent myIntent = new Intent (MainActivity.this, activity2.class);
                 startActivity(myIntent);
            }
       });


// activity2.java
public class activity2 extends AppCompatActivity {
     @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity2);
        }
}

// manifests.xml
    <activity android:name=".activity2" android:label="2번째 액티비티 화면"></activity>

암시적인 인텐트

  • 액티비티 이름을 모르기 때문에 약속된 액션을 지정하면 안드로이드에서 최적의 타깃 컴포넌트를 찾아주는 방법
  • 주로 안드로이드가 제공하는 컴포넌트들을 호출하여 작업할 때 사용

일반적인 인텐트 객체에서 지정 가능한 항목

  • 타킷 컴포넌트 이름 : 명시적 인텐트 경우 정확히 지정
  • 수행 액션의 종류 : 액션들을 결정해 주는 것
  • 액션에 필요한 데이터 : View(보여줄 것), Dial(전화번호)
  • 카테고리
  • 엑스트라 : 타깃 컴포넌트로 전달될 추가적인 정보
// 미국에서 911 전화번호를 거는 경우, 
    Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:/911"));
    startActivity(intent); 
// 이메일을 보낼 경우, 
    Intent intent = new Intent(Intent.ACTION_SEND);     
    intent.putExtra(Intent.EXTRA_EMAIL, recipientArray); 
    startActicity(intent);`
  • 타깃 컴포넌트에 대해 정할 수 없으므로 액션의 종류를 지정

암시적 인텐트

 

암시적 인텐트의 액션 종류

  • ACTIN_VIEW : 데이터를 사용자에게 표시
  • ACTIN_EDIT : 사용자가 편집할 수 있는 데이터 표시
  • ACTION_MAIN : 테스크의 초기 액티비티로 설정
  • ACTION_CALL : 전화 통화 시작
  • ACTION_SYNC : 모바일 장치의 데이터를 서버 상의 데이터와 일치시킴
  • ACTION_DIAL : 전화번호를 누르는 화면을 표시

암시적인 인텐트에 필요한 데이터

  • Uri.parse(string 데이터)
  • ex. ACTION_VIEW content://contacts/people/1 → 1번에 등록된 연락처를 띄움
  • ex. ACTION_VIEW tel:01012345678 → 번호로 전화걸기 화면 띄움

실습

전화걸기 버튼과 웹 브라우저 버튼을 만들기

// MainActivity.java

    public void onClicked(View view) { // onClicked 이벤트 지정 
        Intent myintent = null;
        switch (view.getId()) {
            case R.id.button_call:
                myintent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:(+82)12345678"));
                break;
            case R.id.button_web:
                myintent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.naver.com"));
                break;
        }

        if(myintent != null) {
            startActivity(myintent);
        }
    }

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

 // 안드로이드가 제공하는 컴포넌트를 사용할 때는 [manifests] 파일의 허가 필요

실습 화면


생명주기

  • 액티비티의 생성부터 소멸까지의 주기를 의미함
  • 안드로이드 응용프로그램은 동시에 여러 개의 액티비티가 나올 수 없어 앞에 나온 화면 하나만 활성화된 상태이고 나머지는 모두 비활성화 상태
  • 생명의 상태가 변함에 따라 어떤 메소드가 호출되는지 미리 정의

액티비티의 상태

  • 실행 상태(resumed, running) : 액티비티가 전경에 위치, 사용자의 포커스를 가짐
  • 일시멈춤 상태(paused) : 현재 액티비티의 일부가 약간씩 보이는 경우
  • 정지 상태(stopped) : 액티비티는 배경에 위치

중요한 콜백 메소드

  • onCreate()
    • 액티비티가 생성되면서 호출
    • 중요한 구성요소들을 초기화
  • onPause()
    • 사용자가 액티비티를 떠나고 있을 때, 이 메소드 호출
    • 그 동안 이루어졌던 변경사항 저장
728x90