【问题标题】:Unable to instantiate receiver java.lang.ClassNotFoundException无法实例化接收器 java.lang.ClassNotFoundException
【发布时间】:2012-03-07 12:17:41
【问题描述】:

当我的 android 应用程序尝试实例化我用来在启动时启动服务的接收器时,我在它中遇到错误。错误很明显,找不到我的接收器的类文件。但是我的清单文件,包和所有东西都很好,我不知道发生了什么。这是我的代码:

package dti.obd.reader;

import dti.obd.reader.service.MainService;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class BootReceiver extends BroadcastReceiver 
{
      @Override
      public void onReceive(Context context, Intent intent) 
      {
            Intent serviceIntent = new Intent(MainService.class.getName());
            context.startService(serviceIntent);
      }
}

还有我的清单文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dti.obd.reader"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <service android:name=".service.MainService" >
            <intent-filter >
                <action android:name="dti.obd.reader.service.MainService" />
            </intent-filter>
        </service>

        <receiver android:name="dti.obd.reader.BootReceiver" >
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED" >
                </action>
            </intent-filter>
        </receiver>
    </application>

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

</manifest>

有人知道错误吗?好像包和名字都ok...

【问题讨论】:

    标签: android broadcastreceiver bootcompleted


    【解决方案1】:

    您必须将您的Receiver 放入一些package。如果它在主包上,系统将无法实例化它。

    我遇到了同样的问题。幸运的是,在互联网上搜索错误之前,我正在做另一个 java 项目。我刚刚意识到那里的错误与这个相似。我刚刚尝试过并且有效。 :)

    【讨论】:

    • 你能再解释一下吗?
    【解决方案2】:

    我也遇到过这个问题。将完整的包名称添加到清单文件中的接收器定义没有帮助。问题是有一个旧的 odex 文件对应于我的 apk 文件。 Android系统从odex文件加载类,找不到receiver类。

    解决方法:

    • 删除旧的 odex 文件,或
    • 为您的 apk 指定一个新名称

    http://www.addictivetips.com/mobile/what-is-odex-and-deodex-in-android-complete-guide/

    【讨论】:

    • 我遇到了同样的问题。在之前的版本中,我使用了一个接收器名称A,在当前版本中,我已经将其删除,然后出现此错误
    • 我们的在线申请中出现了这个异常。事实证明,这些解决方案可以解决。
    • 你的 apk 有什么新名字?说真的,你建议我们发布一个新应用:D
    • @batmaci 我的意思是重命名您的工件名称(apk 文件名),无需重命名您的包名称。因此,您可以发布相同的应用程序。 Google play 仅查找应用程序包名称,而不是您所知道的 apk 文件名;)
    【解决方案3】:

    尝试:

    <receiver android:name=".BootReceiver" >
    

    它自己添加了包名,因为你定义了:

    package="dti.obd.reader"
    

    【讨论】:

    • 我已经尝试过这种方式。这就是为什么我更改为再次指定包的原因......但它们都不起作用。感谢您的帮助!
    • 你需要指定包AND这样写receiver line。你们两个是同时的吗?也看看coderanch.com/t/439875/Android/Mobile/…也许你能发现一些不同的东西。 (这不太可能有任何区别)但将user-permission 行放在application 行上方。
    • 我尝试了一切,但没有任何效果。我对这个错误感到非常疯狂。我认为它与包的名称有关,一些我不知道的限制...
    • 这似乎也是错误的:
    • 我明白了。它也与我的虚拟机有关。我创建了一个新的并且它有效。我也做了这些你告诉我的改变,我认为这很有帮助,因为我的清单文件有点乱。谢谢
    【解决方案4】:

    你必须把你的接收器放在某个包里 而是添加 Reciever

    的完整路径
     <receiver android:name="com.yourpackage.BootReceiver" >
    

    听起来很奇怪,但在我的情况下它解决了问题

    希望有人会通过这次经历取得成果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多