『Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린』 교재를 바탕으로 정리한 내용입니다.
// Activity 등록
<activity android:name=".DetailActivity"></activity>
<activity android:name=".MainActivity">. .. 생략 ... </activity>
val intent: Intent = Intent(this, DetailActivity::class.java)
startActivity(intent)
startActivity()
함수를 통해 시스템에 실행을 요청할 컴포넌트의 정보가 담긴 Intent 객체를 전달 val intent = Intent(this, DetailActivity::class.java)
intent.putExtra("data1", "hello")
intent.putExtra("data2",10)
startActivity(intent)
val intent = Intent
val data1 = intent.getStringExtra("data1")
val data2 = intent.getIntExtra("data2", 0)
startActivity()
: 화면을 되돌릴 필요 없을 때사용
registerForActivityResult()
: 결과를 포함해 화면을 되돌릴 때 사용 (실행 시 launch()
사용)
기존에 사용하던 startActivityForResult()는 deprecated 된 이유
- 프로젝트가 커지면그에 따라 onActivityResult 메서드 안에 들어가는 코드도 굉장히 많아지기 때문
→ 유지보수성이 떨어짐
→ requestCode를 지정하는 데에도 명확하지 않다는 단점이 있음
- 퍼미션 요청 시 불편하기 때문
→ requestCode에 따라 분기를 나누고 해당 권한을 가지고 있는지 없는지에 따라 또 분기를 나누게 되므로 퍼미션 요청을 여러 개 해야 하는 경우에는 코드가 복잡해짐
👉 이러한 문제를 해결하기 위해 **[ActivityResultContracts](https://developer.android.com/training/basics/intents/result#custom) 도입**
//결과를 포함해 화면을 되돌리는 경우
val intent = Intent(this, DetailActivity<::class.java)
//startActivityForResult(intent, 10) // deprecated
registerActivity.launch(intent)
private val registerActivity: ActivityResultLauncher<Intent> = registerForActivityResult(
ActivityResultContracts.StartActivityForResult() // ◀ StartActivityForResult 처리를 담당
) { result ->
if (result.resultCode == RESULT_OK) {
val value = result.data?.getStringExtra("resultData")
... 생략 ...
}
}
//DetailActivity에서 화면 되돌리면서 데이터 전달
intent.putExtra("resultData","world")
setResult(RESULT_OK,intent)
finish()
setResult()
함수로 결과를 지정할 때 RESULT_OK, RESULT_CANCELED 등의 상수 지정 가능StartActivityForResult()
가 자동으로 호출됨resultCode
: 인텐트로 실행된 곳에서 돌려받은 결과 코드data
: 결과 데이터가 들어있는 인텐트 객체val intent: Intent = Intent(this, DetailActivity::class.java)
//암시적 인텐트는 intent-filter 이용
//name만 지정한 OneActivity는 명시적 인텐트로만 실행 가능
<activity android:name=".OneActivity"/>
<activity android:name=".TwoActivity">
<intent-filter>
<action android:name="ACTION_EDIT"/>
</intent-filter>
</activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<activity android:name=".TwoActivity">
<intent-filter>
<action android:name="ACTION_EDIT"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="http"/>
//<data android:mimeType="image/*"/>
</intent-filter>
</activity>
//action, data 정보를 인텐트의 각 프로퍼티에 설정하는 방법
val intent = Intent()
intent.action = "ACTION_EDIT"
intent.data = Uri.parse("http://www.google.com")
//intent.type = "image/*"
startActivity(intent)
//생성자의 매개변수로 지정하는 방법
val intent = Intent("ACTION_EDIT", Uri.parse("http://www.google.com"))
startActivity(intent)
val intent = Intent("ACTION_HELLO")
try {
startActivity(intent)
} catch (e: Exception){
Toast.makeText(this,"no app...",Toast.LENGTH_SHORT).show()
}
//지도 앱 액티비티 실행 예시
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:37.7749,129.4194"))
startActivity(intent)
→ 지도를 실행할 액티비티가 여러 개(카카오맵, 네이버 지도, T map 등)인 경우, 사용자에게 연결 프로그램 목록을 띄워 선택하게 함
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("geo:37.7749,129.4194"))
intent.setPackage("com.google.android.apps.maps")
startActivity(intent)
val packageInfo = packageManager.getPackageInfo("com.example.text_outter",0)
val versionName = packageInfo.versionName
<manifest ... 생략 ...>
<queries>
<package android:name="com.e.ch7_layout" />
</queries>
<manifest>