Android API31使用BroadcastReceiver时出现ClassCastException闪退问题求助
问题根因
从崩溃日志的java.lang.ClassCastException: com.example.4.MainActivity cannot be cast to android.app.Activity可以直接定位核心问题:
你在AndroidManifest里把MainActivity声明为启动Activity,但是你的MainActivity实际继承的是BroadcastReceiver广播接收器类,不是android.app.Activity子类,系统启动应用时尝试将它转为Activity类失败,直接触发闪退。
附加问题:你把同一个类同时注册为Activity和BroadcastReceiver,逻辑完全混乱,且Activity对应的布局文件里配置了onClick点击事件,广播接收器类里根本没有对应的broadcastIntent方法,就算绕过闪退后续也会报错。
修复步骤
- 第一步:拆分类,不要把Activity和BroadcastReceiver逻辑写在同一个类里
新建单独的广播接收器类MyBroadcastReceiver.java,把原来MainActivity里的广播逻辑移过去:
package com.example.4; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.widget.Toast; public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show(); } }
- 第二步:重写MainActivity,让它正确继承Activity基类,补充布局加载和广播发送逻辑:
package com.example.4; import androidx.appcompat.app.AppCompatActivity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 加载你编写的activity_main布局 setContentView(R.layout.activity_main); } // 对应布局里按钮的onClick属性,实现自定义广播发送逻辑 public void broadcastIntent(View view) { Intent intent = new Intent(); intent.setAction("com.tutorialspoint.CUSTOM_INTENT"); sendBroadcast(intent); } }
- 第三步:修改AndroidManifest.xml,修正组件注册配置
- 保留MainActivity的Activity注册,删除原来的
tools:ignore="Instantiatable配置(修复后该警告会自动消失,无需手动忽略) - 把原来注册的广播接收器的name改成你新建的
MyBroadcastReceiver
修正后的完整Manifest代码:
- 保留MainActivity的Activity注册,删除原来的
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.example.4"> <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.4"> <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> <receiver android:name=".MyBroadcastReceiver" android:exported="true"> <intent-filter> <action android:name="com.tutorialspoint.CUSTOM_INTENT"> </action> </intent-filter> </receiver> </application> </manifest>
修改完成后重新编译运行即可正常启动应用,点击「Broadcast Intent」按钮就能触发广播弹出对应提示,不会再出现闪退问题。
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

