sendBroadcast发生java.lang.RuntimeException: has no zero argument constructor
时间: 2024-03-05 20:53:38 浏览: 102
这个问题通常是因为你的BroadcastReceiver没有提供默认构造函数(即没有参数的构造函数)。当你使用sendBroadcast发送广播时,系统会尝试实例化BroadcastReceiver,如果它没有默认构造函数,就会导致这个异常。
要解决这个问题,你可以在BroadcastReceiver中添加一个无参数的构造函数。例如:
```
public MyBroadcastReceiver() {
// 无参数的构造函数
}
```
或者你可以通过在Manifest文件中注册BroadcastReceiver时,使用android:name属性来指定BroadcastReceiver的完整类名,避免系统自动实例化BroadcastReceiver。例如:
```
<receiver
android:name=".MyBroadcastReceiver"
android:exported="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
```
这样做可以确保系统不会实例化BroadcastReceiver,并且你可以在BroadcastReceiver中定义任何构造函数。
相关问题
怎么避免子情况java.lang.IllegalStateException: beginBroadcast() called while already in a broadcast
这个错误通常是由于在广播接收器的onReceive()方法中,调用了另一个广播接收器或服务的sendBroadcast()或startService()方法,而这些方法又会触发onReceive()方法,从而导致递归调用,最终导致出现IllegalStateException异常。
为避免这种情况,可以使用以下方法:
1. 在onReceive()方法中不要调用其他广播接收器或服务的sendBroadcast()或startService()方法。
2. 如果必须要调用其他广播接收器或服务的sendBroadcast()或startService()方法,可以将它们放在一个单独的线程中执行,避免在主线程中递归调用。
3. 可以使用LocalBroadcastManager代替全局广播,LocalBroadcastManager只会发送给同一应用程序内的广播接收器,不会触发递归调用。
4. 如果使用了静态注册广播接收器,可以考虑改为动态注册,这样可以在不需要接收广播的时候取消注册,避免产生不必要的递归调用。
5. 在使用异步任务(AsyncTask)时,需要注意在onPostExecute()方法中不要触发广播接收器或服务的sendBroadcast()或startService()方法,因为onPostExecute()方法是在主线程中执行的。
总之,需要注意避免在广播接收器的onReceive()方法中触发递归调用,以避免出现IllegalStateException异常。
06-01 06:12:00.539 0 0 W [GLUE]_MTGPDWNC_RequestSuspendEvent[3204]: u4SuspendEn=0x80100, u4SuspendEvent=0x4 . 06-01 06:11:59.702 1991 5539 W ContextImpl: Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1111 android.content.ContextWrapper.sendBroadcast:468 com.mediatek.twoworlds.tv.TVCallback$6.run:838 java.lang.Thread.run:923 <bottom of call stack> 06-01 06:12:00.553 0 0 W : [GLUE]__Glue_PM_SetupEthernetWakeup Disable WOL!! 06-01 06:12:00.561 0 0 W : [GLUE]__Glue_PM_SetupEthernetWakeup (EEP_WOW = 0) _gi4PDWNCWifiWowState=1 !! 06-01 06:12:00.572 0 0 W : [GLUE]__Glue_PM_SetupEthernetWakeup (EEP_WOL = 0) !!
这是来自Android系统的一组日志,其中包含了多个模块的信息。具体来说:
- 第一个日志(第一行)来自GLUE模块,表示请求挂起事件,并且包含了一些参数信息。
- 第二个日志(第二行)来自ContextImpl模块,表示在没有经过授权的用户的情况下调用系统进程中的方法,具体是发送广播。
- 第三个日志(第三行)来自GLUE模块,表示禁用了以太网唤醒(Wake-on-LAN)功能。
- 第四个日志(第四行)来自GLUE模块,表示启用了以太网唤醒功能,并且设置了EEP_WOW参数。
- 第五个日志(第五行)来自GLUE模块,表示启用了以太网唤醒功能,并且设置了EEP_WOL参数。
这些日志都是系统或应用程序在执行一些操作时生成的。具体操作的含义需要查看模块的源代码才能确定。
阅读全文