गैर गतिविधि से startActivityForResult का उपयोग करें


82

मेरे पास MainActivity है जो एक गतिविधि और अन्य वर्ग है (जो एक साधारण जावा वर्ग है), हम इसे "SimpleClick" कहेंगे। अब मैं उस वर्ग से कमांड startActivityForResult चलाना चाहता हूं।

अब हालांकि मैं उस वर्ग (सिंपलक्लास) को पारित कर सकता हूं, केवल मेनऐक्टिविटी का संदर्भ, समस्या यह है कि, यू कैंट रन संदर्भ.स्टार्टएक्टिविटीफॉरसेल्ट (...);

तो एक ही रास्ता है SimpleClass बनाने का उपयोग 'startActivityForResult; कुछ इस तरह से SimpleClass के लिए एक गतिविधि चर के रूप में MainActivity के संदर्भ को पारित करने के लिए है:

MainActivity class के अंदर मैं SimpleClass का उदाहरण इस तरह से बनाता हूं:

SimpleClass simpleClass=new SimpleClass(MainActivity.this);

अब यह है कि SimpleClass कैसा दिखता है:

public Class SimpleClass {

Activity myMainActivity;

   public SimpleClass(Activity mainActivity) {
       super();
       this.myMainActivity=mainActivity;    
   }
....


    public void someMethod(...) {
        myMainActivity.startActivityForResult(...);
    }

}

अब यह काम कर रहा है, लेकिन ऐसा करने का एक उचित तरीका नहीं है? मुझे डर है कि मैं भविष्य में कुछ मेमोरी लीक कर सकता हूं।

धन्यवाद। रे।


मैं नहीं जानता कि आप क्या करने की कोशिश कर रहे हैं, लेकिन आप को पढ़ना चाहिए इस
मैकरस

1
ऐसा करने से आप onActivityResultअपने simpleClass के अंदर की विधि का उपयोग कर सकते हैं या आपका इरादा नहीं था? यहाँ एक ही समस्या ..
Vivere_FlowCoder

जवाबों:


64

मुझे नहीं पता कि यह अच्छा अभ्यास है या नहीं, लेकिन casting a Context object to an Activity objectठीक संकलन करता है।

इसे इस्तेमाल करे:

if (mContext instanceof Activity) {
        ((Activity) mContext).startActivityForResult(...);
} else {
        Log.e("mContext should be an instanceof Activity.");
} 

इसे संकलित किया जाना चाहिए, और परिणाम को संदर्भ को पकड़े हुए वास्तविक गतिविधि तक पहुंचाया जाना चाहिए।


यदि संदर्भ किसी सेवा से पारित हो जाता है तो कैसा रहेगा?
मधुर आहूजा

9
नहीं, यह एक कास्ट अपवाद लॉन्च नहीं करता है!
लिसा ऐनी

1
एक प्रसंग अनिवार्य रूप से एक गतिविधि नहीं है (उदाहरण के लिए अगर यह साथ हैmyActivity.getApplicationContext()
ह्यूगो ग्रिस

यदि लक्ष्य स्मृति रिसाव से बचना है, तो किसी गतिविधि को आयोजित करने से अधिक वर्ग के सदस्य चर के रूप में एक संदर्भ रखने का क्या फायदा है? क्या किसी प्रसंग को संचय करने की क्षमता एक मेमोरी स्टोरेज को ले जाने की क्षमता नहीं है जैसा कि किसी गतिविधि को संग्रहीत करने के लिए है?
stevehs17

4

यदि आपको पिछली गतिविधि से परिणाम प्राप्त करने की आवश्यकता है, तो आपके कॉलिंग वर्ग को गतिविधि का प्रकार होना चाहिए।

Activity.startActivityForResult()यदि आप कभी भी परिणाम का उपयोग नहीं करते हैं (तो कम से कम आपके द्वारा पोस्ट किए गए नमूना कोड के अनुसार) कॉल करने का उद्देश्य क्या है ।

myMainActivityपरिणाम के साथ कुछ भी करता है? यदि ऐसा है, तो बस SimpleClassगतिविधि का एक उपवर्ग बनाएं और परिणाम को SimpleClassअपने भीतर से संभालें ।
यदि myMainActivityपरिणाम की आवश्यकता है, तो शायद आपको गतिविधि शुरू करने के लिए कोड को फिर से भरना चाहिए myMainActivity


2
मैं परिणाम का उपयोग कर रहा हूं, बस मैं इसे अलग वर्ग के लिए अलग करना चाहता हूं, इसलिए मैं सोच रहा था कि भविष्य में लीक किए बिना, मैं एक गैर-गतिविधि वर्ग को गतिविधि पैरामीटर कैसे पास करूं।
रेमन

1
SimpleClass को नेस्टेड क्लास बनाने के बारे में क्या?
कोडिंग्यूसर

0

बेहतर समाधान है:

  1. SimpleClassअपनी Activityकक्षा का उपवर्ग बनाना
  2. एक और गतिविधि के रूप में बुला रहा है startActivityForResult
  3. SimpleClassअपने भीतर परिणाम को संभालना

3
ऐसा लगता है कि काम करना चाहिए, लेकिन मुझे यह मिला:java.lang.NullPointerException: Attempt to invoke virtual method 'android.app.ActivityThread$ApplicationThread android.app.ActivityThread.getApplicationThread()' on a null object reference
लड़का
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.