2012-08-07 17 views
5

Intent'i genişleten bir MyIntent sınıfı yazdım. ve sonra MyAntivity (MyIntent) çağırmak için bir MyIntent örneğini kullanıyorum.getIntent() ve Intent öğesinin alt sınıfı

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

yapıcı:

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

ancak ben, yeni başlayan aktivitesinde getIntent() çağrı zaman getIntent() döndürülen değeri niyet değil MyIntent, bu

getIntent() instanceof Intent // true; 
getIntent() instanceof MyIntent // false; 
olduğu

(MyIntent) getIntent() öğesini denediğimde, sistem ClassCastException'ı nasıl atar?

+0

Son hedefiniz tam olarak nedir? Bir düğmeyi tıkladığınızda yüklenecek yeni bir sayfa mı istiyorsunuz? veya .. – corecase

cevap

5

Niyet, Parcelable ve Cloneable arabirimini uyguladığı gibi yapamazsınız, amaç nesneler süreçler arasında hareket ettiğinde yeniden oluşturulur. Bu yüzden farklı bir örnek olacak.

source code of ActivityManagerProxy, startActivity içinde, bu niyetin başvuruyla aktarılmayacağını göreceksiniz, bunun yerine yeni bir nesne oluşturmak için bir Parsel'e yazılır. Bu nedenle, önceki Faaliyetteki oluşturulan Niyet nesnesi artık referans alınmayacaktır.

+1

Alt sınıflandırma Intent mümkün değilse LabeledIntent sonra nasıl çalışır? http://developer.android.com/reference/android/content/pm/LabeledIntent.html – Krumelur

4

"Soyut" Amacınızı daha somut bir haline dönüştürmek için kopya oluşturucuyu kullanabilirsiniz. Bu nedenle, Intent sınıfının kopya kurucusunu geçersiz kılmanız ve yalnızca süper araması yapmanız gerekir. Eğer Intent alabilir "hedef aktivite" olarak

... 

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

: Bu durumda, böyle "başlatıcı aktivitesinin" dan bu niyeti başlatabilir

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) 
    } 
} 

:

Amacınız bu Say Bunun gibi:

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

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

Teknik olarak bu abstra için iyi bir yol gibi görünüyor Niyetler aracılığıyla veri aktarımının ayrıntıları. Ancak, her zaman amacı kopyalamak için bir performans sorunu olabilir.