如何修复context.startActivity(intent)引发的应用崩溃报错
问题原因
抛出android.content.ActivityNotFoundException的直接原因是:Android系统要求所有四大组件(包括Activity)必须在应用的AndroidManifest.xml清单文件中显式注册,系统才能找到并启动对应组件。你的日志已经明确指出,无法找到com.example.assignment1mypageambrish.Recipe这个Activity类,本质就是这个Activity没有完成清单注册。
另外你贴的点击事件代码里,new Intent(mContext, Recipe.class)行尾缺少分号,这是语法错误,编译阶段就会报错,注意补上。
修复步骤
- 打开项目中
app/manifests/路径下的AndroidManifest.xml文件 - 在
<application>标签内部,和其他已注册的Activity同级的位置,添加Recipe页面的注册声明,参考代码如下:
<!-- 省略application标签内已有的icon、theme等属性配置 --> <application ...> <!-- 已有的主页面注册,一般自带intent-filter作为启动页 --> <activity android:name=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 新增缺失的Recipe Activity注册 --> <activity android:name=".Recipe" android:exported="false" /> </application>
- 特殊场景排查:如果添加注册后依然报错,检查两个问题:
- 类路径匹配问题:如果
Recipe类没有放在包根目录com.example.assignment1mypageambrish下,需要把android:name的路径补全,比如Recipe放在page子包下,就要写成android:name=".page.Recipe" - Context类型问题:你这段代码写在RecyclerView的Adapter里,如果传入的
mContext是Application级别的Context,启动Activity时需要添加新任务栈标记,否则也会触发崩溃,修改后的点击代码参考:
public void onClick(View v) { Intent intent = new Intent(mContext, Recipe.class); intent.putExtra("Name",mData.get(i).getRecipeName()); intent.putExtra("Description",mData.get(i).getRecipeDescription()); intent.putExtra("Duration",mData.get(i).getRecipeDuration()); intent.putExtra("Method", mData.get(i).getRecipeMethod()); intent.putExtra("Ingredients", mData.get(i).getRecipeIngredients()); // Application Context启动Activity必须加这个flag intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); } - 类路径匹配问题:如果
注意:如果是Android 12及以上版本,所有注册的Activity必须显式指定
android:exported属性,否则编译会不通过,普通不需要被外部应用打开的页面设置为false即可。
内容的提问来源于stack exchange,提问作者Ambrish
相关产品推荐
相关产品推荐

