Android基础#14: Android问题解决--Unable to find explicit activity class,ActivityNotFoundException,未声明Act

    错误信息,通常直指问题根源。-----箴言-----

内容简介:

本节来看一个常见的崩溃问题。

问题描述:
在进行Android应用程序开发时,经常遇到“AndroidRuntime: FATAL EXCEPTION: main”,“android.content.ActivityNotFoundException: Unable to find explicit activity class ”问题,程序直接崩溃。

分析:

直接看log错误信息,很明显,是没有声明对应的Activity导致的。尤其是刚开始进行Android开发时,经常忘记声明Activity。参考关键log如下:

android.content.ActivityNotFoundException: Unable to find explicit activity class {com.test.myapplication5/com.test.myapplication5.activity.SubFrameActivity}; have you declared this activity in your AndroidManifest.xml?

“在AndroidManifest.xml中,你声明了这个activity么?”

再一检查代码,确实是没有声明。 

解决方式:
只要在AndroidMenifest.xml文件中进行Activity的声明即可。

举例:
下面是一个AndroidMenifest.xml,如果注释掉SubFrameActivity,就会出现“Unable to find explicit activity class”这种问题。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.myapplication5">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication5">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/Theme.MyApplication5.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
<!--        <activity android:name=".activity.SubFrameActivity"></activity>-->
    </application>

</manifest>

具体的错误信息参考如下:
 



10-16 20:32:50.481 564-929/system_process D/Interception: result: allow, reason: callerPkg == calleePkg, rule: runType===activity|||callerPkg===com.test.myapplication5|||calleePkg===com.test.myapplication5|||calleeClass===com.test.myapplication5.activity.SubFrameActivity|||action===null
10-16 20:32:50.481 564-929/system_process I/ActivityManager: START u0 {cmp=com.test.myapplication5/.activity.SubFrameActivity} from uid 10042 on display 0
10-16 20:32:50.482 2699-2699/com.test.myapplication5 D/AndroidRuntime: Shutting down VM
    
    
    --------- beginning of crash
10-16 20:32:50.483 2699-2699/com.test.myapplication5 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.test.myapplication5, PID: 2699
    android.content.ActivityNotFoundException: Unable to find explicit activity class {com.test.myapplication5/com.test.myapplication5.activity.SubFrameActivity}; have you declared this activity in your AndroidManifest.xml?
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1794)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1512)
        at android.app.Activity.startActivityForResult(Activity.java:3942)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:675)
        at android.app.Activity.startActivityForResult(Activity.java:3902)
        at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:662)
        at android.app.Activity.startActivity(Activity.java:4231)
        at android.app.Activity.startActivity(Activity.java:4199)
        at com.test.myapplication5.MainActivity$1.onClick(MainActivity.java:34)
        at android.view.View.performClick(View.java:5204)
        at android.view.View$PerformClick.run(View.java:21153)
        at android.os.Handler.handleCallback(Handler.java:739)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5539)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:745)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:635)
10-16 20:32:50.489 564-1639/system_process W/ActivityManager:   Force finishing activity com.test.myapplication5/.MainActivity
10-16 20:32:50.492 564-596/system_process D/ActivityManager: Nemu don't show crash dialog of ProcessRecord{2592e89 2699:com.test.myapplication5/u0a42}
10-16 20:32:50.493 564-594/system_process D/Interception: result: allow, reason: calleePkg is system app, rule: runType===broadcast|||callerPkg===android|||calleePkg===com.mumu.acc|||calleeClass===com.mumu.acc.AccMsgReceiver|||action===uu.intent.action.STOP_ACCELERATE
10-16 20:32:50.493 906-1068/com.netease.nemu_vapi_android.nemu D/com.netease.nemu_android_watchdog_lib.core.Watchdog: upload event: {"architecture":"x86_64","channel":"mac-nochannel","engine":"MAC","language":"zh-Hans","package":"mac-nopackage","usage":"0","uuid":"2909ab3a6d7656d98d4abc40b42ebc06","version":"1.9.21","x":{"app_elapse":29,"app_name":"MyApplication5","app_package":"com.test.myapplication5","error":{"code":0,"msg":"ok"},"token":""}}	type: ExitAPP	sign: I2Zjzeiz7/+eE95c77VVf/5xrqA=	uid: 1000
10-16 20:32:50.495 1082-1082/com.mumu.acc D/AccService: AccMsgReceiver: uu.intent.action.STOP_ACCELERATE
10-16 20:32:50.497 564-1639/system_process I/com.android.server.tabs.TabManagerService: notifyClosing:741: notify tab closed in android as it's closed task com.test.myapplication5, taskId: 742, elapseTime: 29578
10-16 20:32:50.502 2699-2699/com.test.myapplication5 I/Process: Sending signal. PID: 2699 SIG: 9

扩展:

从log信息中,看可以看到一个Activity被启动时的堆栈信息。这有利于理解Activity的生命周期。

这不就是很多面试官最喜欢问的问题么? 建议读者一定要深刻理解这些错误信息。


注:重视错误信息,重视警告信息,重视提示信息。

<think>首先,用户的问题是关于Android开发中的错误:"android.content.ActivityNotFoundException: Unable to find explicit activity class com.app.deco fix"。这是一个常见错误,表明在尝试启动一个Activity时,系统找不到它,通常是因为没有在AndroidManifest.xml文件中声明它。 根据系统指令,我需要: - 使用中文回答。 - 结构清晰,逐步解决问题- 确保回答真实可靠。 - 在行内数学表达式使用$...$格式(但这里可能不涉及数学,所以我会注意)。 - 独立公式使用$$...$$格式(同样,可能不适用)。 - 在回答中引用的段落末尾添加引用标识。 - 生成相关问题。 参考提供的引用: - [^1], [^2], [^3], [^4] 都讨论了类似的问题,强调了在AndroidManifest.xml中声明Activity的重要性。 - 解决方案包括手动或自动添加Activity到清单文件。 我的回答结构: 1. **理解问题**:解释错误的原因。 2. **解决方案**:提供逐步修复方法。 3. **代码示例**:如果需要,展示如何添加ActivityAndroidManifest.xml。 4. **生成相关问题**:在最后添加。 确保回答真实可靠:基于Android开发的最佳实践。 最终输出格式: - 回答部分。 - §§相关问题§§ 部分。 回答内容: - 错误原因:Activity未在AndroidManifest.xml中声明- 修复步骤: 1. 打开AndroidManifest.xml文件。 2. 在<application>标签内添加<activity>声明。 3. 指定Activity的完整类名。 4. 可选:添加intent-filter或其他属性。 5. 保存并重建项目。 - 自动化工具:使用IDE的快捷方式(如Alt+Enter)自动添加。 生成相关问题- 基于常见Android开发问题。 相关问题示例: 1. 如何避免ActivityNotFoundException错误? 2. AndroidManifest.xml中Activity声明的最佳实践是什么? 3. 如何处理多个Activity的跳转?</think>### 解决 "android.content.ActivityNotFoundException: Unable to find explicit activity class" 错误 在 Android 开发中,当您尝试通过 `Intent` 启动一个 Activity 时,如果系统找不到对应的 Activity 类,就会抛出 `ActivityNotFoundException` 错误。错误信息通常为: `E/AndroidRuntime: FATAL EXCEPTION: main ... android.content.ActivityNotFoundException: Unable to find explicit activity class {com.app.deco/...}; have you declared this activity in your AndroidManifest.xml?` 这表示您未在 `AndroidManifest.xml` 文件中正确声明目标 Activity。以下是逐步修复方法: #### 错误原因分析 - **核心问题**:Android 系统要求所有 Activity 必须在 `AndroidManifest.xml` 中显式声明,否则无法识别和启动。 - **常见场景**: - 新增 Activity 后忘记手动添加到清单文件。 - Activity 类名拼写错误或包路径不匹配。 - 使用隐式 Intent 时未配置正确的 `<intent-filter>`(但本例为显式 Intent)[^1][^2][^3]。 #### 逐步修复方法 1. **打开 AndroidManifest.xml 文件** 在项目的 `app/src/main/` 目录下找到 `AndroidManifest.xml`。 2. **声明目标 Activity** 在 `<application>` 标签内添加 `<activity>` 声明,指定完整的类名。例如,如果您的 Activity 类名为 `DecoActivity` 且包名为 `com.app.deco`: ```xml <application ... > <!-- 其他组件(如已有Activity--> <activity android:name=".DecoActivity" /> <!-- 使用相对路径 --> <!-- 或绝对路径:<activity android:name="com.app.deco.DecoActivity" /> --> </application> ``` - 确保 `android:name` 的值与代码中的类名一致(区分大小写)[^3][^4]。 3. **添加主题或其他属性(可选)** 如果需要自定义主题或配置 Intent Filter,可扩展声明: ```xml <activity android:name=".DecoActivity" android:theme="@style/AppTheme" <!-- 示例主题 --> android:exported="true"> <!-- 若允许外部启动 --> <!-- 如需隐式Intent支持,添加intent-filter --> </activity> ``` 4. **自动化添加(推荐)** 在 Android Studio 中: - 打开目标 Activity 的 Java/Kotlin 文件。 - 将光标置于类名上,按 `Alt + Enter`(Windows/Linux)或 `Option + Enter`(Mac)。 - 选择 **Add activity to manifest**,IDE 会自动添加声明[^3]。 5. **验证并重建项目** - 保存文件后,清理并重建项目:**Build > Clean Project** 然后 **Build > Rebuild Project**。 - 运行应用测试跳转逻辑是否正常。 #### 预防措施 - **最佳实践**:每次创建新 Activity 时,立即通过 IDE 自动添加到清单文件。 - **调试技巧**:如果错误仍存在,检查: - 类名拼写(如 `DecoActivity` vs `Decoactivity`)。 - 包路径是否匹配项目结构。 - 清单文件中是否有重复或冲突的声明[^2][^4]。 通过以上步骤,问题通常能立即解决。如果涉及隐式 Intent 或动态注册,需额外检查 `<intent-filter>` 配置[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值