본문 바로가기
2022년

Intent Filter

by 박상윤 2021. 10. 20.

- 안드로이드의 4대 구성요소는 모두 AndroidManifest.xml 파일에 기록되어야 한다.

- 이 때 다른 애플리케이션이 실행할 수 있도록 하고자 한다면 Intent filter를 이용해 이름을 설정해주면 된다.

- 애플리케이션 단말기에 설치되면 안드로이드 OS는 지정된 IntentFilter의 이름을 확인하여 정리하고 실행 요청을 받으면 이를 실행할 수 있다.

 

상황 : NewProject를 이용해서 App1과 App2라는 서로 다른 새로운 프로젝트를 만들었다.

 

앱이 다름에도 서로 데이터를 주고 받을 수 있다.

 

App2

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sypark.activityapp2">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ActivityApp2">
        <activity
            android:name=".SecondActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="kr.co.softcampus.test_activity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <!-- intent-filter를 사용해서 다른 앱에서도 사용할 수 있게끔 해준다-->
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

intent-filter -> action -> 본인 마음대로 작성 / intent-filter -> category -> 정해진 형식

action의 name이 중요하다!

package com.sypark.activityapp2

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_second.*

class SecondActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)

        val data1 = intent.getIntExtra("data1",0)
        val data2 = intent.getStringExtra("data2")

        textView.text = "data1:${data1}"
        textView.append("data2:${data2}")

        button.setOnClickListener {

            val result_intent = Intent()
            result_intent.putExtra("value1",0)
            result_intent.putExtra("value2","Bye")
            setResult(RESULT_OK,result_intent)
            finish()
        }
    }
}

 

App1

package com.sypark.activityapp1

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    val SECOND_REQUESCODE = 100

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener {
            val test_intent = Intent("kr.co.softcampus.test_activity")
            test_intent.putExtra("data1",100)
            test_intent.putExtra("data2","hello")
            startActivityForResult(test_intent,SECOND_REQUESCODE)
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(requestCode==SECOND_REQUESCODE){
            if(resultCode== RESULT_OK){
                val value1 = data?.getIntExtra("value1",0)
                val value2 = data?.getStringExtra("value2")

                textView.text = "value1:${value1}\n"
                textView.append("value2:${value2}")
            }
        }
    }
}

 

1. App1에서 App2로 데이터 전달 확인

 

2. App2에서 App1으로 데이터 전달

 

 

만약, "kr.co.softcampus.test_activity" 이름을 가진 똑같은 어플이 하나 더있다면 어떻게 될까?

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sypark.activityapp3">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ActivityApp3">
        <activity
            android:name=".ThirdActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="kr.co.softcampus.test_activity"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
package com.sypark.activityapp3

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_third.*

class ThirdActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_third)

        val data1 = intent.getIntExtra("data1",0)
        val data2 = intent.getStringExtra("data2")

        textView.text = "data1:${data1}\n"
        textView.append("data2:${data2}\n")

        button.setOnClickListener {
            val result_intent = Intent()
            result_intent.putExtra("value1",30)
            result_intent.putExtra("value2","문자열3")
            setResult(RESULT_OK,result_intent)
            finish()
        }
    }
}

 

App2와 App3를 둘 다 물어보게 된다.

 

 

정리

- Intent Filter를 통해 액티비티의 이름을 등록하면 다른 애플리케이션의 요청에 의해 실행이 가능하다.

'2022년' 카테고리의 다른 글

Toast  (0) 2021.10.21
Activity Action  (0) 2021.10.21
객체 전달하기  (0) 2021.10.20
데이터 전달하기  (0) 2021.10.20
onActivityResult  (0) 2021.10.20