java.lang.RuntimeException: 无法实例化服务

3
我正在编写一个监控短信的应用程序。我希望从我的主Activity类启动一个服务,但是由于某种原因,该服务没有启动。我认为可能是我在清单文件中声明服务的方式或者我从活动中调用服务的方式存在问题。下面是我的活动代码的一部分:
public class TablighBlockActivity extends Activity {
    /** Called when the activity is first created. */
    private ToggleButton toggEnable;

    public void onCreate(Bundle savedInstanceState) {
        if (loadState("running")==false){startService(new Intent(this, SMSMonitor.class));}
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

以下是我Service类的一部分代码:

public class SMSMonitor extends BroadcastReceiver {


@Override
public void onReceive(Context context, Intent intent) {

    Intent i = new Intent(context,SMSMonitor.class);
    i.setClass(context, SMSMonitor.class);
    context.startService(i);

以下是我的清单文件:

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

    <uses-sdk android:minSdkVersion="3" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>


    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <receiver android:name="SMSMonitor">  
            <intent-filter>  
                <action android:name="android.intent.action.BOOT_COMPLETED" /> 
                <action android:name="android.provider.Telephony.SMS_RECEIVED"></action> 
            </intent-filter>  

        </receiver>

        <activity
            android:name=".TablighBlockActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:enabled="true" android:name=".SMSMonitor"
                                    android:process=":smsmonitor"
                                    ></service>
    </application>

</manifest>

以下是错误日志:

06-22 13:46:14.649: W/dalvikvm(1013): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
06-22 13:46:14.668: E/AndroidRuntime(1013): Uncaught handler: thread main exiting due to uncaught exception
06-22 13:46:15.038: E/AndroidRuntime(1013): java.lang.RuntimeException: Unable to instantiate service tabligh.block.SMSMonitor: java.lang.ClassCastException: tabligh.block.SMSMonitor
06-22 13:46:15.038: E/AndroidRuntime(1013):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2449)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at android.app.ActivityThread.access$2800(ActivityThread.java:112)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at android.os.Looper.loop(Looper.java:123)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at android.app.ActivityThread.main(ActivityThread.java:3948)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at java.lang.reflect.Method.invokeNative(Native Method)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at java.lang.reflect.Method.invoke(Method.java:521)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
06-22 13:46:15.038: E/AndroidRuntime(1013):     at dalvik.system.NativeStart.main(Native Method)
06-22 13:46:15.038: E/AndroidRuntime(1013): Caused by: java.lang.ClassCastException: tabligh.block.SMSMonitor
06-22 13:46:15.038: E/AndroidRuntime(1013):     at android.app.ActivityThread.handleCreateService(ActivityThread.java:2446)
06-22 13:46:15.038: E/AndroidRuntime(1013):     ... 10 more

谢谢。

您是否在清单文件中添加了服务所需的权限? - Pedro Teran
由于权限问题导致 java.lang.ClassCastException? - jn1kk
3个回答

3
   public class SMSMonitor extends BroadcastReceiver {

您是SMSMonitor,它是一个BroadcastReceiver而不是Service。
Intent i = new Intent(context,SMSMonitor.class);
    i.setClass(context, SMSMonitor.class);
    context.startService(i);

1
谢谢,这应该是问题的原因。当我从清单文件中删除服务标签和start.Service(i)部分时,应用程序似乎可以工作。 - Wise

1

tabligh.block.SMSMonitor 是你的清单文件中的接收器和服务吗?

我认为它应该是一个服务,并扩展广播接收器到SMSMonitor。

 <receiver android:name="SMSMonitor"> **and**  

   <service android:enabled="true" android:name=".SMSMonitor"
                                    android:process=":smsmonitor"
                                    ></service>

AND

Intent i = new Intent(context,SMSMonitor.class);
//i.setClass(context, SMSMonitor.class);<<Remove this line no need...
context.startService(i);

0

有时候我会因为没有在 onCreate() 中使用标准的 super.onCreate()setContentView() 而遇到奇怪的错误。

就像其他人说的那样,确保你已经将 Service 添加到了你的 Manifest 文件 中。这个和在创建 Activities 后忘记添加它们是我最大的错误!

编辑:抱歉,不知道怎么错过了你放在那里的所有 Manifest 代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接