Home 인텐트 및 인텐트 필터
Post
Cancel

인텐트 및 인텐트 필터

인텐트 (Intent)

  • Intent는 메시징 객체로 다른 앱이나 액티비티로 작업을 요청하는데 사용할 수 있다.
  • 사용 방법은 크게 세 가지로 나눌 수 있다.
    1. 액티비티 시작
      • 새로운 액티비티를 시작할 때 Intent에 시작할 액티비티 정보를 담고 startActivity(...)함수로 실행할 수 있다.

        1
        2
        
          val intent = Intent(this, SecondActivity::class.java)
          startActivity(intent)
        
      • 액티비티에서 결과를 받기 위해서는 registerForActivityResult함수를 이용해 결과를 받을 수 있다.

        기존에는 startActivityForResultonActivityResult함수를 이용해 결과를 받을 수 있었으나 현재는 메모리 관련 문제로 인해 Deprecated 되어 사용되지 않는다.

    2. 서비스 시작
      • 사용자 인터페이스 없이 백그라운드에서 작업을 수행하는 구성 요소로서 API 21 이상부터는 JobScheduler로 서비스를 시작할 수 있지만 그 이하 버전에서는 Service 클래스의 메서드를 사용해 시작할 수 있다.
      • 파일 다운로드와 같은 1회성 작업은 startService에 작업을 수행할 Intent객체를 전달하면 되고, 지속적으로 접근해 무엇인가를 처리해야 하거나 여러 액티비티에서 접근해야할 때는 bindServiceIntent를 전달해주면 된다.
    3. 브로드캐스트 전달
      • 시스템과 앱 또는 앱과 앱 간에 이벤트를 주고받을 수 있다.
      • 앱이 브로드캐스트를 받기 위해서는 Receiver를 등록해주어야하며 앱이 브로드캐스트를 보내기 위해서는 sendBroadcast를 이용해 보낼 수 있다.

인텐트 유형

명시적 인텐트

  • 대상 앱의 패키지 이름이나 클래스의 이름을 인자로 제공한다.
  • 시작하려고 하는 액티비티나 서비스의 클래스 이름을 알고있기 때문에 일반적으로 앱 안에서 구성 요소를 시작할 때 쓰인다.
  • 아래 예시는 앱 안에 DownloadService라는 서비스 클래스를 구축했다고 가정한다.

    1
    2
    3
    4
    5
    6
    
      // Executed in an Activity, so 'this' is the Context
      // The fileUrl is a string URL, such as "http://www.example.com/image.png"
      val downloadIntent = Intent(this, DownloadService::class.java).apply {
          data = Uri.parse(fileUrl)
      }
      startService(downloadIntent)
    

암시적 인텐트

  • 수행할 작업을 다른 앱의 구성 요소가 처리할 수 있도록 한다.
  • 안드로이드 시스템에서 다른 앱들의 매니페스트 파일에 선언된 인텐트 필터와 비교해서 작업을 처리할 수 있는 적절한 구성 요소를 표현해준다.
  • 예를들어, 사진첩에서 사진을 선택해 배경화면으로 설정하도록 하는 것을 의미한다.

    intent-filters_2x

  • 암시적 인텐트를 처리할 앱이 없을 수 있으므로 resolveActivity함수를 이용해 수신할 앱이 없을 경우 null을 반환한다는 것을 이용해 처리한다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      // Create the text message with a string
      val sendIntent = Intent().apply {
          action = Intent.ACTION_SEND
          putExtra(Intent.EXTRA_TEXT, textMessage)
          type = "text/plain"
      }
    
      // Verify that the intent will resolve to an activity
      if (sendIntent.resolveActivity(packageManager) != null) {
          startActivity(sendIntent)
      }
    
  • 위 예시는 보내기 전용 및 전달할 데이터의 타입과 메시지의 Intent를 선언하고 resolveActivity를 이용해 이 인텐트를 처리할 앱이 있는지 확인한 후 있다면 해당 앱에 인텐트를 전송한다는 뜻이 된다.

인텐트 필터

  • 앱의 매니페스트 파일에 들어가 있는 것으로 해당 구성 요소가 수신하고자 하는 인텐트의 유형을 나타낸다.
  • 단, 보안문제 때문에 API 21 부터는 개발자가 암시적 인텐트로 bindService를 호출하면 예외를 발생시킨다.
  • 매니페스트 파일에 있는 <intent-filter> 태그를 이용하며 내부에는 <action>, <data>, <category> 태그 중 하나 이상을 사용해 인텐트 유형을 지정할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    
      <activity android:name="ShareActivity">
          <intent-filter>
              <action android:name="android.intent.action.SEND"/>
              <category android:name="android.intent.category.DEFAULT"/>
              <data android:mimeType="text/plain"/>
          </intent-filter>
      </activity>
    
  • 위 예시는 데이터 유형이 텍스트이고 ACTION_SEND 인텐트를 수신할 인텐트 필터가 있는 액티비티 선언이다.

[출처]

  • https://developer.android.com/guide/components/intents-filters?hl=ko
This post is licensed under CC BY 4.0 by the author.

안드로이드의 Activity와 Lifecycle

안드로이드 레이아웃 xmlns:android,app,tools

Comments powered by Disqus.