2010-11-06 13 views
40

मैं एक वेब पेज पर परिवर्तन के लिए बाहर देखने के लिए मेरी Activity से एक Service शुरू करने के लिए कोशिश कर रहा हूँ से गतिविधि को सूचित करें, यह तो मैं बैटरी जीवन परेशान नहीं है के लिए एक निजी अनुप्रयोग है ...सेवा

लेकिन मैं मैं अपने Service से अपने Activity पर डेटा पास करना चाहता हूं ... मुझे से Activity पर कॉल करने का कोई तरीका नहीं दिख रहा है। इसे कैसे प्राप्त किया जा सकता है?

उत्तर

47

जैसा कि एलेक्स ने इंगित किया है, आप सेवा से जुड़ सकते हैं और घटनाओं पर उपयोग करने के लिए सेवा के किसी प्रकार के श्रोता या कॉलबैक पास कर सकते हैं।

या, आप प्रसारण के दायरे को सीमित करने के लिए एक प्रसारण Intent, शायद setPackage()Intent पर जैसे तरीकों का उपयोग कर उपयोग कर सकते हैं।

या, आप createPendingResult() उपयोग कर सकते हैं एक PendingIntent है कि आप सेवा के लिए एक Intent अतिरिक्त के रूप में पारित बनाने के लिए - सेवा तो उपयोग कर सकते हैं कि PendingIntent अपनी गतिविधि में onActivityResult() को गति प्रदान करने।

या, आप ResultReceiver का उपयोग कर सकते हैं।

या, आप Messenger का उपयोग कर सकते हैं।

(वैसे, मैं उन बाद के दो दृष्टिकोण प्रयास नहीं किया है, लेकिन मुझे लगता है कि वे यहाँ काम करेंगे)

+0

मैं लंबित आशय का उपयोग करने के onactivityresult कॉल करने के लिए कोशिश कर रहा हूँ, लेकिन यह सब – Mars

+0

आशय notificationIntent = नए आशय (यह, activity.class) को नहीं बुलाया जा रहा है; \t \t notificationIntent.putExtra ("captchaUrl", captchaUrl); \t \t लंबित सामग्री सामग्रीइन्टेंट = लंबित INTent.getActivity (यह, 0, अधिसूचनाइन्टेंट, 0); – Mars

+0

@ मर्स: आप जो कर रहे हैं वह वह नहीं है जो मैंने लिखा था।मैंने लिखा: "या, आप' createPendingResult() 'का उपयोग 'लंबित इंटेंट' बनाने के लिए कर सकते हैं जिसे आप सेवा के लिए अतिरिक्त 'इरादा' के रूप में पास करते हैं - सेवा तब 'लंबित इंटेंट' का उपयोग 'एक्टिविटी रिसेट()' पर ट्रिगर करने के लिए कर सकती है। आपकी गतिविधि में। " मैंने 'अधिसूचना' के साथ 'createPendingResult() 'का उपयोग करने का प्रयास नहीं किया है, लेकिन मुझे संदेह है कि यह काम नहीं करेगा। ध्यान रखें कि आपने मूल रूप से लिखा था, "मैं अपनी सेवा से डेटा को अपनी गतिविधि में पास करना चाहता हूं", जिसका 'अधिसूचना' से कोई लेना देना नहीं है। – CommonsWare

0

ResultReceiver तंत्र एक और पोस्ट में समझाया गया है: - Restful API service लेकिन यह सभी मामलों में कार्य नहीं करेगा । कृपया उस पोस्ट पर मेरी टिप्पणी देखें। सीमित स्कोप प्रसारण या लंबित इंटेन्ट तंत्र अधिक उपयुक्त प्रतीत होता है।

1

कुछ बदसूरत तरीके:

1.) गतिविधि अभी तक शुरू नहीं किया है, तो intent और startActivity, का उपयोग लेकिन intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

2. याद) अन्यथा यदि गतिविधि पहले से ही शुरू हो गया है, तो आप लिख सकते हैं गतिविधि में अपनी कॉलबैक विधि और सेवा में विधि पंजीकृत करें, फिर सेवा में विधि को सीधे कॉल करें।

आशा कुछ स्मार्ट तरीका खोजने के लिए।

मुझे लगता है कि प्रसारण भी अच्छी तरह से काम करता है, आप प्रसारण प्राप्त करने और गतिविधि शुरू करने के लिए एक स्थिर आंतरिक कक्षा लिख ​​सकते हैं। लेकिन यह मेरी राय में भी बदसूरत है।

3

एक और विकल्प: अपनी सेवा को अद्यतन करता है, तो सामग्री प्रदाता, गतिविधि ContentObserver के माध्यम से सूचित किया जा सकता है। यह पर्याप्त होगा यदि आपकी सेवा सर्वर से कुछ डेटा डाउनलोड करती है और आप बस गतिविधि में ताजा सामग्री प्रदर्शित करना चाहते हैं।

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