액티비티는 앱에서 기본 단위가 되고 가장 많이 쓰이는 컴포넌트다. 앞으로 몇 편을 나누어 액티비티에 관해 포스팅을 하려고 한다.
그 전에 간단한 내용부터 시작해보자.
액티비티는 다른 컴포넌트와 마찬가지로 AndroidManifest.xml
에 선언해야 한다. 설정 파일에 액티비티를 추가할 뿐이지만, 액티비티 개수가 많아지면 유지하기도 어려우므로 불필요하게 많이 만들지 말 것을 권장한다. 내부 UI 액션이 많고 로직이 많다면 액티비티를 우선적으로 고려하고, 다른 액티비티 위에 팝업 형식으로 뜬다면 커스텀 레이아웃 다이얼로그나 DialogFragment
, PopupWindow
로 대체한다.
기준은 단순하다. 독립적인 화면이면 액티비티가 적합하고, 종속적인 화면으로 보인다면 다른 것을 어떻게 쓸 수 있는지를 생각해보는게 좋다.
보통 Activity에서는 setContentView 메서드로 레이아웃을 설정해서 화면에 표시한다. 그러나 때에 따라 setContentView를 실행하지 않고, 로직에 따라 분기해서 다른 액티비티를 띄우는 용도로 사용하기도 한다. setContentView를 실행하지 않는다면 결국 UI가 없는 액티비티다.
이 때 AndroidManifest.xml
에서 여러 액티비티에 각각 intent-filter
엘리먼트를 추가하지 않고 관문(front controller) 역할의 액티비티 1개에만 여러 스킴의 intent-filter를 추가한다.
이 액티비티에서는 스킴에 따라 다른 액티비티를 시작하고 자신은 종료한다.
<activity android:name=".FrontControllerActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="doc" />
<data android:scheme="xls" />
<data android:scheme="ppt" />
</intent-filter>
</activity>
android.intent.action.VIEW
액션과 함께 doc, xls, ppt 스킴이 전달되면 FrontControllerActivity
에서 처리하겠다는 의미이다.
그럼 이 액티비티는 이 스킴을 처리하는 내용을 갖고 있으면 된다.
class FrontControllerActivity : Activity {
val WORD_SCHEME = "doc"
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
val uri = intent.data
when(uri.scheme) {
WORD_SCHEME -> {
startActivity(Intent(this, WordActivity::class.java)
}
}
finish()
}
}
when절에서 스킴에 따라 액티비티를 시작하고 FrontControllerActivity
는 종료한다.
만약 호출하는 쪽이라면 아래와 같은 코드를 사용하거나 링크를 클릭한다
val uri = Uri.parse("doc://microsoft/0000")
val intent = Intent(Intent.ACTION_VIEW, uri)
startActivity(intent)