5

使ってみると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 がオフです
D/AndroidRuntime(4174): メインエントリ com.android.commands.am.Am を呼び出しています
D/dalvikvm( 4184): CheckJNI の遅延有効化
D/AndroidRuntime(4174): VM をシャットダウンしています
I/ActivityManager( 148): サービス com.example.nullptrservice/.MyService の proc com.example.nullptrservice を開始します: pid=4184 uid=10066 gids={}
I/AndroidRuntime(4174): 注: スレッド 'Binder Thread #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(ネイティブメソッド)
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(ネイティブメソッド)
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(ネイティブメソッド)
E/AndroidRuntime(4184): java.lang.Class.newInstance(Class.java:1319)
E/AndroidRuntime(4184): android.app.ActivityThread.handleCreateService(ActivityThread.java:2234)
E/AndroidRuntime( 4184): ... 10 以上

アンドロイド 4.0.3

また、SOには関連する質問がたくさんあります

4

2 に答える 2

15

オブジェクトが作成/初期化されているときに、 Service(またはActivityそのことについては) を として使用することはできません。Context

代わりに、そこでオーバーライドonCreate()して初期化を行い、明示的なコンストラクターを取り除きます。

于 2013-08-14T09:38:55.720 に答える
-1

onCreate() またはサービス コンストラクターからハンドラーを使用して、ハンドラー内で作業を行ってください。

于 2013-08-14T09:42:28.203 に答える