일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 스위프트 카메라
- Flutter NativeView
- 안드로이드 바로가기
- 푸시 데이터 저장
- Swift flutterview
- 스위프트
- 안드로이드 앨범
- 앱 꺼졌을 때 푸시 데이터 저장
- FlutterView MethodChannel
- swift sms
- 스위프트 앨범
- 안드로이드 숏컷
- flutter 회전
- Flutter UIKitView MethodChannel
- swift 문자
- swift autolayout
- 스위프트 UserDefaults
- 노티피케이션 익스텐션
- 스위프트 푸시
- native flutter view
- 안드로이드 에러
- 스위프트 테이블 뷰 셀
- 플러터 뷰 컨트롤러
- flutter rotate
- 안드로이드 FCM
- 앱 백그라운드 푸시 데이터 저장
- silent push
- NotificationService Extension
- Swift flutterviewcontroller
- 스위프트 웹뷰
- Today
- Total
Things take time
[Android] getIntent()로 넘어온 데이터 초기화하기(공유하기, 스키마 관련) 본문
[개요]
외부의 앱(크롬, 앨범, 외부 메신저 등)에서 현재 개발중인 앱의 공유하기로 노출시키려면 intent filter라는 개념이 도입된다. 또한, 모바일 웹(크롬 등)에서 앱을 실행시킬 때, 공유하기가 아니라 스키마란 방법을 통해서도 앱을 실행시킬 수 있다.(매니페스트에 <data host.. scheme..>로 등록)
[문제]
만약 공유하기나 스키마를 처리할 액티비티 A가 있다고 가정하자. A라는 액티비티는 맨처음 실행되는 액티비티로써, 외부에서 들어온 데이터를 작업하고 그에 따라 B, C, D.. 등의 다른 액티비티로 startActivity를 호출한다.
공유하기로 켜진 앱은 B로, 스키마로 켜진 앱은 C로, 외부데이터 없이 일반적인 경우에는 D 액티비티로 실행한다고 가정한다.
1. 공유하기를 통해 A액티비티가 실행되고, A에서는 공유하기로 왔다 판단하여 B액티비티를 실행한다. 여기서 뒤로가기를 눌렀다면?
2. 외부 스키마를 통해 A액티비티가 실행되고, A에서는 스키마로 판단하여 C액티비티를 실행한다. 여기서 뒤로가기를 눌렀다면?
1의 경우에는 A액티비티로 갔다가 다시 B로 가게 되고, 2의 경우에는 A액티비티로 갔다가 C액티비티를 실행한다. 이 경우 문제가 발생하는 이유는, 뒤로가기했을 경우에는 일반적으로 한번 원하는 작업(공유하기, 스키마)을 수행했으므로, 일반적인 경우인 D액티비티를 실행하길 바란다는 것이다.
[해결]
답은 간단하다. getIntent()로 넘어온 데이터를 초기화해야한다. 한번 startActivity를 하면, getIntent()를 초기화해서 다시 finish()를 통해 A액티비티가 켜져도, getIntent()로 데이터가 초기화되었으므로 D로 넘어가면 되는 것이다.
단, 공유하기로 왔을 때와 스키마로 넘어왔을때는 getIntent()이후 처리방식이 다르므로 초기화를 새로해야한다.
1. 공유하기
getIntent().removeExtra("key");
만약 공유하기를 getIntent().getStringExtra("key")와 같은 소스로 처리했다면 위와같이 초기화한다. 만약, 공유하기를 통해 여러 개의 키 값을 받았다면, 여러 줄을 쓰는 것보다 아래와 같이 하는 것이 낫다.
getIntent().getExtras().clear();
2. 스키마
스키마를 통해 공유하기를 하게 되면, 매니페스트에 등록된 (스키마://호스트)의 방식으로 켜진다. 파라미터를 추가로 한다면, 스키마://호스트?param=abc로 웹에 기록될 것이고 앱에서는 getIntent().getData().getQueryParameter("param")으로 처리할 것이다. 여기서는 쿼리 파라미터를 초기화해야하는데, 아래와 같이 getData()를 초기화해야한다.
getIntent().setData(null);
위의 방법대로 각각의 인텐트를 초기화하면, 원하는 대로 한 번만 공유/스키마 작업을 하고, 이후 액티비티가 닫혔을 때 원래 하던방식대로 실행된다.
'Android(기능)' 카테고리의 다른 글
[Android] Constraint Layout, 제약조건을 사용하는 레이아웃 (0) | 2020.05.07 |
---|---|
[Android] TextView에 Linkify로 링크 걸기 및 액티비티 이동 (0) | 2020.01.15 |
[Android] Textfield의 setText("")와 getText().clear() (0) | 2019.11.04 |
[Android] Sqlite Update Date 및 Mysql Update Date (0) | 2019.11.04 |
[Android] Fragment Activity, 프래그먼트 액티비티란 (0) | 2019.07.05 |