안드로이드 개발

Default Activity not found 해결 방법

피커 2023. 5. 10. 22:25
728x90
반응형

안드로이드 개발중에 아래처럼 Could not identify launch activity: Default Activity not found 이라는

에러 메시지를 보게 된다면 간단히 해결할 수 있는 해결 방법을 공유합니다.

 

1. 에러 로그

  -. Could not identify launch activity: Default Activity not found
      Error while Launching activity
       Failed to launch an application on all devices

2. 에러 코드

   -. java / kt 파일에선는 에러의 원인을 찾을 수 없습니다.

     AndroidManifest.xml에 보면 그 원인을 찾을 수 있습니다.    

   위 XML 파일을 보게 되면 .MainActivity를 정의하였지만, 앱 실행시 컴파일러는 어느 activity가

    main인지 알기 어렵습니다. 

 

3. 해결 방법

   -. AndroidManifest.xml에서 본인이 원하는 주가 되는 activity에 대해 아래와 같이 intent-filter를 적용해주면 해결됩니다.

      파란색으로 마킹된 부분입니다.

     아주 간단한 해결이지만, 실제로 삽질을 하게되면 자꾸 java / kt 파일만 수정하여 결국 스파게티 코드가 됩니다.

 

 

<intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

4. 관련 백서 (white paper)

안드로이드 개발자 오피셜 사이트에서 발췌

암시적 인텐트 수신

앱이 수신할 수 있는 암시적 인텐트가 어느 것인지 알리려면, <intent-filter> 요소를 사용하여 각 앱 구성 요소에 대해 하나 이상의 인텐트 필터를 매니페스트 파일에 선언합니다. 각 인텐트 필터는 인텐트의 작업, 데이터 및 카테고리를 기반으로 어느 유형의 인텐트를 수락하는지 지정합니다. 시스템은 인텐트가 인텐트 필터 중 하나를 통과한 경우에만 암시적 인텐트를 앱 구성 요소에 전달합니다.
참고: 명시적 인텐트는 항상 자신의 대상에게 전달되며, 이는 구성 요소가 어떤 인텐트 필터를 선언하든 무관합니다.
앱 구성 요소는 자신이 수행할 수 있는 각각의 고유한 작업에 대하여 별도의 필터를 선언해야 합니다. 예를 들어 이미지 갤러리 앱에 있는 어떤 액티비티에 두 개의 필터가 있을 수 있습니다. 한 필터는 이미지를 보고, 다른 필터는 이미지를 편집하기 위한 것입니다. 액티비티가 시작되면, Intent를 검사한 다음 Intent에 있는 정보를 근거로 어떻게 동작할 것인지 결정합니다(편집기 제어 항목을 표시할 것인지 말 것인지 등).
각 인텐트 필터는 앱의 매니페스트 파일에 있는 <intent-filter>요소에서 정의하고, 이는 대응되는 앱 구성 요소에서 중첩됩니다(예: <activity> 요소). <intent-filter> 내부에서는 다음과 같은 세 가지 요소 중 하나 이상을 사용하여 허용할 인텐트 유형을 지정할 수 있습니다.
<action>name 특성에서 허용된 인텐트 작업을 선언합니다. 이 값은 어떤 작업의 리터럴 문자열 값이어야 하며, 클래스 상수가 아닙니다.<data>허용된 데이터 유형을 선언합니다. 이때 데이터 URI(scheme, host, port, path)와 MIME 유형의 여러 가지 측면을 나타내는 하나 이상의 특성을 사용합니다.<category>name 특성에서 허용된 인텐트 카테고리를 선언합니다. 이 값은 어떤 작업의 리터럴 문자열 값이어야 하며, 클래스 상수가 아닙니다.참고: 암시적 인텐트를 수신하려면 CATEGORY_DEFAULT 카테고리를 인텐트 필터에 포함해야 합니다. startActivity()  startActivityForResult() 메서드는 마치 CATEGORY_DEFAULT 범주를 선언한 것처럼 모든 인텐트를 취급합니다. 이 카테고리를 인텐트 필터에서 선언하지 않으면 액티비티에 어떤 암시적 인텐트도 확인되지 않습니다.

 

 

 

반응형