web-dev-qa-db-ja.com

Activity.onCreate()で、Intent.getExtras()がnullを返すことがあるのはなぜですか?

これはおそらく誤警報でした。 私自身の答え を参照してください。以下の元の質問:

アクティビティには、ユーザーを別のアクティビティに移動するためのボタンがあります。新しいアクティビティを起動するために、インテントにエクストラを入力し、onCreate()、新しいアクティビティはIntent.getExtras()を介してそれらのエクストラから読み取ります。返されるバンドルはnull以外であると想定しましたが、顧客のクラッシュレポートが検出されると、getExtras()がnullを返すことがあります。

この回答が示すように のようにエクストラをヌルガードすることは完全に問題ありませんが、インテントのエクストラを設定すると、なぜ後でヌルを返すのでしょうか?エクストラを読むのに適した場所(onResume()など)はありますか?

編集:キーに必要な命名規則に従わないことが原因である可能性があります:

名前にはパッケージプレフィックスを含める必要があります。たとえば、アプリcom.Android.contactsは「com.Android.contacts.ShowAll」のような名前を使用します。

これは Intent.putExtras javadoc からのものです。この命名規則に従わないとどうなりますか。振る舞いも定義されていますか?

関連するコードは次のとおりです。

class FromActivity extends Activity {

    ImageButton button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.from_view);

        button = (ImageButton)findViewById(R.id.button);
        button.setVisibility(View.VISIBLE);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(FromActivity.this, ToActivity.class);
                i.putExtra(ToActivity.SERVER_PARAM, ...);
                i.putExtra(ToActivity.UUID_PARAM, ...);
                i.putExtra(ToActivity.TEMPLATE_PARAM, ...);
                startActivityForResult(i, 0); 
                overrideTransition(R.anim.slide_left_in, R.anim.slide_left_out);
            }
        });
    }

}

class ToActivity extends Activity {

    public static final String SERVER_PARAM = "server";
    public static final String UUID_PARAM = "uuid";
    public static final String TEMPLATE_PARAM = "template";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            finish();
            return;
        }

        // do stuff with extras
    }
}

この問題のサンプルスタックトレースは次のとおりです。

Java.lang.RuntimeException: Unable to start activity ComponentInfo{ToActivity}: Java.lang.NullPointerException
    at  Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2355)
    at  Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2391)
    at  Android.app.ActivityThread.access$600(ActivityThread.Java:151)
    at  Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1335)
    at  Android.os.Handler.dispatchMessage(Handler.Java:99)
    at  Android.os.Looper.loop(Looper.Java:155)
    at  Android.app.ActivityThread.main(ActivityThread.Java:5493)
    at  Java.lang.reflect.Method.invokeNative(Native Method)
    at  Java.lang.reflect.Method.invoke(Method.Java:511)
    at  com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1028)
    at  com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:795)
    at  dalvik.system.NativeStart.main(Native Method)
     Caused by: Java.lang.NullPointerException
    at  ToActivity.onCreate(SourceFile:49)
    at  Android.app.Activity.performCreate(Activity.Java:5066)
    at  Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1101)
    at  Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2311)
     ... 11 more
     Java.lang.NullPointerException
    at  ToActivity.onCreate(SourceFile:49)
    at  Android.app.Activity.performCreate(Activity.Java:5066)
    at  Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1101)
    at  Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2311)
    at  Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2391)
    at  Android.app.ActivityThread.access$600(ActivityThread.Java:151)
    at  Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1335)
    at  Android.os.Handler.dispatchMessage(Handler.Java:99)
    at  Android.os.Looper.loop(Looper.Java:155)
    at  Android.app.ActivityThread.main(ActivityThread.Java:5493)
    at  Java.lang.reflect.Method.invokeNative(Native Method)
    at  Java.lang.reflect.Method.invoke(Method.Java:511)
    at  com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1028)
    at  com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:795)
    at  dalvik.system.NativeStart.main(Native Method)
20
Ten-Young Guh

これはおそらく誤警報でした。独自のインスタンス変数がnullであることが原因である可能性が高くなります。

class ToActivity extends Activity {

    public static final String SERVER_PARAM = "server";
    public static final String UUID_PARAM = "uuid";
    public static final String TEMPLATE_PARAM = "template";

    private State state;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        state = initializeState();
        // MISSING NULL CHECK HERE!

        Bundle extras = getIntent().getExtras();
        if (extras == null) {
            finish();
            return;
        }

        // do stuff with state and extras
    }
}
3
Ten-Young Guh

あなたはそれをこのように得ることができます:

getIntent().getStringExtra(key);

または:

getIntent().getExtras().getString(key)

そして、「FromActivity」で次のように設定します。

Bundle extras = new Bundle();
extras.putString(key, value);
intent.putExtras(extras);
//And start your activity...

または:

intent.putExtra(key, string);
//And start your activity...

どちらの方法でも機能するはずです。これがお役に立てば幸いです...

よろしく!

17
Martin Cazares

理論的には、アクティビティを開始するインテントはどこからでも発生する可能性があります。別のプログラム

1
tallen

Nullポインタエラーが発生しましたが、初期化を見逃しましたか?また、コードのどの行にこのエラーがあるかを教えてください。ところで、処理するアクティビティが多い場合は、意図にフラグを設定することをお勧めします。

0
Spark8006