Things take time

[Android] getIntent()로 넘어온 데이터 초기화하기(공유하기, 스키마 관련) 본문

Android(기능)

[Android] getIntent()로 넘어온 데이터 초기화하기(공유하기, 스키마 관련)

겸손할 겸 2019. 11. 21. 11:10

[개요]

외부의 앱(크롬, 앨범, 외부 메신저 등)에서 현재 개발중인 앱의 공유하기로 노출시키려면 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);

위의 방법대로 각각의 인텐트를 초기화하면, 원하는 대로 한 번만 공유/스키마 작업을 하고, 이후 액티비티가 닫혔을 때 원래 하던방식대로 실행된다.