Android 14 - 암시적 인텐트 변경사항 및 문제 해결

Android 14에서 암시적 인텐트 관련하여 변경사항이 있습니다.

Android 14를 타게팅하는 앱에게만 아래 내용이 적용됩니다.

  • 암시적 인텐트로 Activity 등 Component를 실행하거나 이벤트를 전달할 때, exported=true로 설정된 Component에게만 전달됨.
  • exported=false로 설정된 Component를 실행하거나 이벤트를 전달할 때는 명시적 인텐트를 사용해야 함.
  • Mutable Pending Intent를 사용할 때, 명시적 인텐트를 사용하지 않으면 Exception이 발생함.

이 변경사항으로 발생하는 문제와 해결 방법을 알아보겠습니다.

1. 암시적 인텐트와 exported=false로 발생하는 Exception

Android 14를 타게팅하는 앱이, 암시적 인텐트로 exported=false인 Activity를 실행하려고 하면 Exception이 발생합니다.

예를 들어, 아래와 같이 exported=false로 정의된 Activity가 있습니다.

<activity android:name=".AppActivity" android:exported="false">
    <intent-filter>
        <action android:name="com.example.action.APP_ACTION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

아래와 같은 암시적 인텐트로 이 Activity를 실행하려고 하면, Exception이 발생합니다.

val implicitIntent = Intent("com.example.action.APP_ACTION")
startActivity(implicitIntent)

에러 로그

04-09 10:21:52.241  7303  7303 E AndroidRuntime: Process: com.example.myapplication, PID: 7303
04-09 10:21:52.241  7303  7303 E AndroidRuntime: android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.example.action.APP_ACTION }
04-09 10:21:52.241  7303  7303 E AndroidRuntime: 	at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2238)
04-09 10:21:52.241  7303  7303 E AndroidRuntime: 	at android.app.Instrumentation.execStartActivity(Instrumentation.java:1877)
04-09 10:21:52.241  7303  7303 E AndroidRuntime: 	at android.app.Activity.startActivityForResult(Activity.java:5589)
04-09 10:21:52.241  7303  7303 E AndroidRuntime: 	at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:676)
04-09 10:21:52.241  7303  7303 E AndroidRuntime: 	at android.app.Activity.startActivityForResult(Activity.java:5547)
04-09 10:21:52.241  7303  7303 E AndroidRuntime: 	at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:663)
04-09 10:21:52.241  7303  7303 E AndroidRuntime: 	at android.app.Activity.startActivity(Activity.java:6045)

2. exported=true로 변경하여 문제 해결

암시적 인텐트를 사용해야 한다면, Activity의 exported 속성을 true로 변경하면 됩니다.

아래와 같이 Activity를 설정하면, 암시적 인텐트로 Exception을 발생시키지 않고 Activity를 실행시킬 수 있습니다.

<activity android:name=".AppActivity" android:exported="true">
    <intent-filter>
        <action android:name="com.example.action.APP_ACTION" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

3. 명시적 인텐트로 변경하여 문제 해결

외부에 공개하면 안되는 것이라서 exported를 false로 설정해야 한다면, 명시적 인텐트로 실행하면 됩니다.

아래와 같이 명시적 인텐트로 실행하면 Exception 발생 없이 Activity가 실행됩니다.

val explicitIntent = Intent("com.example.action.APP_ACTION")
explicitIntent.setPackage("com.example.myapplication")
startActivity(explicitIntent)
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha