2012-08-07 6 views
5

मैंने एक वर्ग माईन्टेंट लिखा जो इरादा बढ़ाता है। और फिर मैं StartActivity (MyIntent) को आमंत्रित करने के लिए MyIntent का एक उदाहरण उपयोग करता हूं।getIntent() और इरादे के उप-वर्ग

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, कि

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

जब मैं कोशिश करता हूं (MyIntent) getIntent() सिस्टम मुझे क्लासकास्ट अपवाद फेंकता है.कैसे?

+0

आपका अंतिम लक्ष्य वास्तव में क्या है? जब आप बटन पर क्लिक करते हैं तो आप एक नया पेज लोड करना चाहते हैं? या .. – corecase

उत्तर

5

आप ऐसा नहीं कर सकते हैं, क्योंकि इरादा Parcelable और Cloneable इंटरफ़ेस लागू करता है, जब यह उद्देश्य ऑब्जेक्ट प्रक्रियाओं में चला जाता है तो इसे फिर से बनाया जाता है। इसलिए यह एक अलग उदाहरण होगा।

source code of ActivityManagerProxy, startActivity में आप देखेंगे कि इरादा संदर्भ द्वारा पारित नहीं किया जाएगा, बल्कि यह एक नई वस्तु बनाने के लिए पार्सल में लिखा गया है। तो पिछली गतिविधि में निर्मित इरादा वस्तु अब संदर्भित नहीं की जाएगी।

+1

यदि subclassing इरादा संभव नहीं है तो लेबल किए गए इंटेन्टेंट कैसे काम करता है? http://developer.android.com/reference/android/content/pm/LabeledIntent.html – Krumelur

4

आप अपने "अमूर्त" इरादे को एक और ठोस में बदलने के लिए प्रतिलिपि बनाने वाले का उपयोग कर सकते हैं। इसलिए आपको Intent कक्षा की कॉपी कन्स्ट्रक्टर को ओवरराइड करने की आवश्यकता होगी और बस सुपर कॉल करें।

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()); 
} 
... 

तकनीकी रूप से यह अस्त्र्रा के लिए एक अच्छा तरीका प्रतीत होता है इरादों के माध्यम से डेटा हस्तांतरण का विवरण सीटी। हालांकि, यह हमेशा इरादे की प्रतिलिपि बनाने के लिए एक प्रदर्शन समस्या हो सकती है।

संबंधित मुद्दे