- 안드로이드의 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 |