Splash & Dextor

나고수·2022년 3월 7일
0

1일1공부

목록 보기
13/68

안드로이드 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)
    }
}

profile
되고싶다

0개의 댓글