Android Studio) Intent와 앱 연동

chaeyoung·2023년 1월 17일
0

Android Studio

목록 보기
6/13
post-thumbnail

Intent(인텐트)

Intent: 앱의 컴포넌트 기반, 의뢰를 받고 실행을 명령하는 구조

인텐트의 기본 개념

  • 안드로이드 컴포넌트 구조(4개) : 엑티비티(화면출력 목적), 서비스(백그라운드 작업), 콘텐츠 프로바이더(데이터 공유), 브로드캐스트 리시버(이벤트 모델로 수행)
  • 안드로이드 컴포넌트는 똑같이 클래스 작성되었더라도 각 클래스가 독립적이다.
    • A 에서 B를 실행할 때 직접 결합하지 않고 대행자(=안드로이드시스템)를 사용한다.
      • A 액티비티는 시스템 의뢰 -> 시스템 의뢰를 받아 B 액티비티 실행
      • 컴포넌트 = 클래스의 생명주기를 시스템이 관리
      • 시스템이 즉, Intent(인텐트)이다.
  • 인텐트(Intent): 컴포넌트를 실행하기 위해 시스템에 넘기는 정보
    • 실행하고자 하는 컴포넌트 정보를 담은 인텐트를 시스템에 넘기면 시스템에서 인텐트 정보 분석해 맞는 컴포넌트를 실행

명시적 인텐트 / 암시적 인텐트

명시적 인텐트: 실행하고자 하는 컴포넌트 클래스명을 인텐트에 담는 방법

  • 주로 같은 앱의 컴포넌트를 실행할 때 사용
  • 주소록 앱에서 상세보기와 목록이 있다는 예시
     Intent intent = new Intent(this, DetailActivity.class);
      startActivity(intent)
    • startActivity(): 인텐트를 시스템에 의뢰
    • Intent 객체에 실행하고자 하는 컴포넌트 정보를 주면된다.

암시적 인텐트: 클래스명을 알 수 없는 외부앱의 컴포넌트 실헹 때 사용

  • 클래스 명이 아닌, Intent Filter 정보 사용
  • AndroidManifest.xml에 등록된 컴포넌트 정보를 가져온다.
    •  <activity android:name=".DetailActivity">
       	<intent-filter>
        	<action android:name="com.example.ACTION_VIEW"/>
            <category android:name="android.intent.category.DEFAULT"/>
          </intent-filter>
       </activity>
      • DetailActivity를 위해 클래스명과 intent-filter 정보를 가지게된다.
      • 클래스명을 명시하지 않고 intent-filter에 등록된 정보를 이용하는 암시적 인텐트도 가능
        Intent intent = new Intent();
         intent.setAction("com.example.ACTION_VIEW");
         startActivity(intent);

인텐트필터(Intent Filter)

 <activity android:name=".DetailActivity">
     <intent-filter>
       <action android:name="com.example.ACTION_VIEW"/>
       <category android:name="android.intent.category.DEFAULT"/>
       <data android:scheme="http"/>
      </intent-filter>
  </activity>

- action: 컴포넌트가 어떤 능력을 갖고 있는지에 대한 문자열(VIEW, EDIT,...)
- category: 컴포넌트에 대한 추가정보, 어느 범주의 컴포넌트인지 표현하는데 사용(Lancher, browser,..)
- data: 컴포넌트 실행 위해 필요한 데이터에 대한 상세 정보 명시
- 암시적 인텐트 사용시 <category android:name="android.intent.category.DEFAULT"/>는 필수적으로 작성해야함( category 지정해도 반드시 필수작성)

  • data 가 선언되었을 때
    • intent-filter에 <data android:scheme="geo"/>라고 선언
      - scheme, host, port, path 선언 가능
      • 컴포넌트 실행시 인텐트 정보에 데이터 정보도 추가해야한다.
         Intent intent = new Intent();
         intent.setAction("com.example.ACTION_VIEW");
         intent.setData(Url.parse("geo:");
         startActivity(intent);

Extra 데이터

  • 컴포넌트 실행하면서 데이터를 전달해야할 때(ex. 목록화면에서 상세보기 화면 엑티비티 실행시 글번호)
  • Intent intent = new Intent(this, DetailActivity.class);
     intent.putExtra("data1","hello");
     intent.putExtra("data2",100);
     startActivity(intent);
    • Extra 데이터는 <key, value> 성격으로 담겨짐
    • DetailActivity에서 자신이 실행한 인텐트를 얻어 그 인텐트 객체에 담긴 데이터를 얻는 구조
    • DetailActivity의 실행코드
      Intent intent = getIntent();
      String data1 = intent.getStringExtra("data1");
      int data2 = intent.getIntExtra("data2",0);
      • getIntent(): 자신이 실행했던 인텐트 객체 얻기
      • getXXXExtra(): 객체에 담긴 데이터를 얻음

결과 되돌리기

  • 사용자가 뒤로가기 버튼을 누르지 않고 되돌어아오게 처리해야할 때 사용
    • startActivity() 사용x, startActivityForResult() 사용o
    •  Intent intent = new Intent(this, DetailActivity.class);
       startActivityForResult(intent,10);
       
       Intent intent = getIntent();
       intent.putExtra("location", textView.getText().toString());
       setResult(RESULT_OK, intent)'
       finish();
      • requestCode: 개발자가 0이상의 숫자를 지정한 뒤 결과를 돌려받을 때 구분받기 위해 사용
      • setResult(): 자신의 싱태를 지정
      • finish(): 함수 호출 종료

0개의 댓글