5

Intent を拡張するクラス MyIntent を作成しました。次に、MyIntent のインスタンスを使用して startActivity(MyIntent) を呼び出します。

MyIntent i=new MyIntent(this,NewActivity.class);

コンストラクターは次のとおりです。

public MyIntent(Context context,Class<?> cls){
super(context,cls);
putExtra(var1,var2);
//other codes
((Activity)context).startActivity(this);
}

ただし、新しく開始されたアクティビティで getIntent() を呼び出すと、getIntent() の戻り値は MyIntent ではなく Intent です。

getIntent() instanceof Intent // true;
getIntent() instanceof MyIntent // false;

(MyIntent)getIntent() を試すと、システムが ClassCastException をスローします。

4

2 に答える 2

5

ParcelableIntent が実装およびCloneableインターフェイスするため、Intent オブジェクトがプロセス間を移動するときに再作成されるため、これを行うことはできません。したがって、それは別のインスタンスになります。

ActivityManagerProxy、startActivityのソース コードでは 、インテントが参照によって渡されず、新しいオブジェクトを作成するために Parcel に書き込まれていることがわかります。そのため、以前のアクティビティで作成された Intent オブジェクトは参照されなくなります。

于 2012-08-07T02:16:25.303 に答える
4

コピー コンストラクターを使用して、「抽象的な」インテントをより具体的なインテントに変換できます。Intentしたがって、クラスのコピー コンストラクターをオーバーライドし、単純に super を呼び出す必要があります。

これがあなたの意図だと言います:

public class StronglyTypedIntent extends Intent {
    private final static String ID = "verySecret";    

    public StronglyTypedIntent(final Activity initiator, final String someInformation) {
        super(initiator, SomeTargetActivity.class);
        putExtra(ID, someInformation);
    } 

    public StronglyTypedIntent(final Intent original) {
        super(original);
    }

    public String getSomeInformation() {
        return getStringExtra(ID)
    }
}

次に、次のように「イニシエーター アクティビティ」からこのインテントを開始できます。

...

public void someLogicInTheInitiatingActivity() {
    startActivity(new StronglyTypedIntent(this, "some information"));
}
...    

「ターゲットアクティビティ」では、次のIntentようになります。

...
public void someLogicInTheTargetActivity() {
    StronglyTypedIntent intent = new StronglyTypedIntent(getIntent());

    doSomethingWithTheInformation(intent.getSomeInformation());
}
...

技術的には、これはインテントを通じてデータ転送の詳細を抽象化する良い方法のようです。ただし、インテントを常にコピーすると、パフォーマンスの問題が発生する可能性があります。

于 2013-08-25T08:39:58.410 に答える