如果尝试使用它,我会得到NullPointerException。如果从构造函数中移出,则可以正常工作。所以,我很好奇发生了什么。

这是代码:

package com.example.nullptrservice;

import android.app.Service;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    public MyService() {
        super();
        PackageManager pm = this.getPackageManager();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId){
        Log.i("MyService", "---------- started --------");
        return Service.START_NOT_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) { return null; }
}

当我手动运行服务时,这是logcat输出:

D/AndroidRuntime(4174):
D/AndroidRuntime(4174):AndroidRuntime START com.android.internal.os.RuntimeInit
D/AndroidRuntime(4174):CheckJNI为OFF
D/AndroidRuntime(4174):调用主条目com.android.commands.am.Am
D/dalvikvm(4184):后启用CheckJNI
D/AndroidRuntime(4174):关闭虚拟机
I/ActivityManager(148):为服务com.example.nullptrservice/.MyService启动proc com.example.nullptrservice:pid = 4184 uid = 10066 gids = {}
I/AndroidRuntime(4174):注意:线程'Binder线程#3'的附加失败
D/dalvikvm(4174):GC_CONCURRENT释放103K,81%释放489K/2560K,暂停1ms + 1ms
D/jdwp(4174):有唤醒信号,无法选择
D/dalvikvm(4174):调试器已分离;对象注册表有1个条目
D/AndroidRuntime(4184):关闭VM
W/dalvikvm(4184):threadid = 1:线程以未捕获的异常退出(group = 0x409ee1f8)
E/AndroidRuntime(4184):致命异常:主要
E/AndroidRuntime(4184):java.lang.RuntimeException:无法实例化服务com.example.nullptrservice.MyService:java.lang.NullPointerException
E/AndroidRuntime(4184):位于android.app.ActivityThread.handleCreateService(ActivityThread.java:2237)
E/AndroidRuntime(4184):位于android.app.ActivityThread.access $ 1600(ActivityThread.java:123)
E/AndroidRuntime(4184):位于android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1201)
E/AndroidRuntime(4184):位于android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(4184):位于android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(4184):位于android.app.ActivityThread.main(ActivityThread.java:4424)
E/AndroidRuntime(4184):位于java.lang.reflect.Method.invokeNative( native 方法)
E/AndroidRuntime(4184):位于java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(4184):位于com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:784)
E/AndroidRuntime(4184):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
E/AndroidRuntime(4184):位于dalvik.system.NativeStart.main( native 方法)
E/AndroidRuntime(4184):由以下原因引起:java.lang.NullPointerException
E/AndroidRuntime(4184):位于android.content.ContextWrapper.getPackageManager(ContextWrapper.java:86)
E/AndroidRuntime(4184):位于com.example.nullptrservice.MyService。(MyService.java:12)
E/AndroidRuntime(4184):位于java.lang.Class.newInstanceImpl( native 方法)
E/AndroidRuntime(4184):位于java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime(4184):位于android.app.ActivityThread.handleCreateService(ActivityThread.java:2234)
E/AndroidRuntime(4184):...还有10个

Android 4.0.3

在这里也有a bunchrelated问题

最佳答案

创建/初始化对象时,不能将Service(或与此相关的Activity)用作Context

相反,重写onCreate()并在那里进行初始化,并摆脱显式构造函数。

09-27 09:23