안드로이드 splash를 구현해보자. 덤으로 splash 화면에서 퍼미션도 체크해보자(dextor 라이브러리를 이용) 참고
ㅤ
splash를 잘못 구현 한 경우 :
mainActivty가 뜨기 전 splashActivity를 먼저 띄운 후 1,2초 후에 mainActivity가 뜨게 하는, splash를 말 그 대로 그냥 런처 액티비티로 기능하게끔 하는 경우가 많다.
하지만 이렇게 되면, 앱이 이미 준비가 다 된후 splash액티비티가 뜨게 되는 것이기 때문에 '앱이 준비되기까지 기다리는 동안 보여지는 화면==splash'의 기능을 못하게된다.
사용자가 그냥 쓸떼없이 스플래쉬를 보는동안 시간낭비를 하게 되는 것이다.
ㅤ
구글에 의하면사용자가 앱을 실행할 때 앱 프로세스가 실행되지 않거나(콜드 스타트) 활동이 만들어지지 않은 상태(웜 스타트)라면 다음 이벤트가 발생합니다. 스플래시 화면은 핫 스타트 중에 표시되지 않습니다.
스플래쉬화면은 콜드스타트나, 웜스타트 상태에서 앱이 준비 될 동안 보여지는 화면인데, 이미 핫스타트인 상태에서 (앱이 다 준비가 된 상태에서) 쓸떼없이 추가적인 화면이 보여지게 되는 것이다.
그러므로, 그냥 런처액티비티로서의 스플래쉬가 아니라 진짜 앱이 준비되는 동안 보여지는 화면으로써의 기능을 하는 스플래쉬를 구현해보자.
//drawable/background_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@android:color/background_dark" />
<item>
<bitmap
android:src="@drawable/airbnb"
android:gravity="center"/>
</item>
</layer-list>
//theme.xml
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style>
//manifest.xml
//mainactivity는 그대로 나두고, splashActivity 추가
<activity android:name=".SplashActivity"
android:exported="true"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//SplashActivity.kt
//oncreate()되자마자 메인액티비티로 넘겨도되고
//나는 스플래쉬에서 권한을 체크했다. (dextor library 이용)
class SplashActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Dexter.withContext(this)
.withPermissions(
Manifest.permission.CAMERA,
Manifest.permission.READ_CONTACTS,
Manifest.permission.RECORD_AUDIO
).withListener(object : MultiplePermissionsListener {
//첫 실행 시 권한 여부를 다 묻고 실행되는 메소드
//report에는 areAllPermissionsGranted or isAnyPermissionPermanentlyDenied 가 들어 있음
override fun onPermissionsChecked(report: MultiplePermissionsReport) {
if (report.areAllPermissionsGranted()) {
//모든 권한이 허용 되었으면 메인 액티비티로 간다.
goMain()
return
}
//모든 권한이 허용된게 아니면 세팅으로 가서 권한설정을 하게 한다.
goSetting()
}
//재실행 시 거부한 권한이 있으면 이 메소드가 실행 됨
override fun onPermissionRationaleShouldBeShown(
// list : 거부한 권한 이름이 저장되어 있다.
permissions: List<PermissionRequest>,
token: PermissionToken
) {
token?.continuePermissionRequest()
//권한이 한번 거부됨 > 다시 요청 하려면 추가적인 설명이 필요한듯?
//Android will notify you when you are requesting a permission that needs an additional explanation for its usage,
//either because it is considered dangerous,
//or because the user has already declined that permission once.
//개인적으로 코드를 짜도 되지만 이 코드를 쓰면 권한을 다시 요청할 수 있음
}
}).check()
}
private fun goMain() {
val intent = Intent(this, MainActivity::class.java)
startActivity(intent)
finish()
}
private fun goSetting() {
val intent = Intent(ACTION_APPLICATION_DETAILS_SETTINGS)
intent.data = Uri.parse("package:" + this.getPackageName())
startActivity(intent)
}
}