2012-04-09 7 views
13

onOptionsItemSelected() के कार्यान्वयन से बुलाया गया निम्न स्निपेट, उपयोगकर्ता को मेरे ऐप से ईमेल पते, विषय और शरीर से पहले भरने वाले मेल क्लाइंट में ले जाने के लिए अच्छी तरह से काम करता है। मैं इसे मुझे प्रतिक्रिया देने देने के लिए एक सरल तरीका के रूप में उपयोग कर रहा हूं।Intent.createChooser() को ब्रॉडकास्ट रिसीवर और कार्यान्वित करने की आवश्यकता क्यों है?

String uriText = 
    "mailto:" + emailAddress + 
    "?subject=" + subject + 
    "&body=" + body; 

Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uriText)); 
startActivity(Intent.createChooser(emailIntent, "Pick an email app:")); 

जब मेल एप्लिकेशन (एंड्रॉयड 4.0.4 के साथ अपने नेक्सस एस पर) को खोलता है, LogCat निम्नलिखित आउटपुट, और मैं यह पता लगाने क्यों नहीं कर सकते हैं; Google और SO createChooser unregisterReceiver निष्फल प्रतीत होता है, और मुझे createChooser() के कई उदाहरण नहीं मिल रहे हैं जो unregisterReceiver() पर भी इस स्थिति में सहायता करते हैं।

04-08 21: 26: 19.094: ई/ActivityThread (27894): गतिविधि com.android.internal.app.ChooserActivity IntentReceiver [email protected] लीक किया गया है मूल रूप से किया गया है कि यहां पंजीकृत क्या आप unregisterReceiver() को कॉल खो रहे हैं?

04-08 21: 26: 19.094: ई/ActivityThread (27894): android.app.IntentReceiverLeaked: गतिविधि com.android.internal.app.ChooserActivity IntentReceiver com.android.internal.app.ResolverActivity लीक किया गया है $ 1 @ 4150aac8 जो मूल रूप से यहां पंजीकृत था। क्या आप unregisterReceiver() को कॉल खो रहे हैं?

04-08 21: 26: 19.094: ई/ActivityThread (27894):। Android.app.LoadedApk $ ReceiverDispatcher (LoadedApk.java:763)

पर यह एक Android बग की तरह लगता है क्योंकि मेरी अपना कोड registerReceiver() पर कॉल नहीं करता है, तो एंड्रॉइड शिकायत क्यों कर रहा है कि मुझे unregisterReceiver() पर कॉल करने की आवश्यकता है?

+0

मैं के साथ मेरी नेक्सस एस 4.0.4 –

+0

इस एमुलेटर में होता है एक ही समस्या आ रही है? यदि नहीं, [यह] (https://groups.google.com/forum/?fromgroups#!topic/android-developers/POS_LeIim_U) से संबंधित हो सकता है। – trutheality

उत्तर

11

मैं इसे 4.0.4 के साथ अपने गैलेक्सी नेक्सस पर भी देखता हूं, लेकिन केवल तभी होता है जब केवल एक विकल्प होता है और चयनकर्ता दिखाई नहीं देता है।

यह एंड्रॉइड स्रोत में एक बग है - आप इसके बारे में ज्यादा कुछ नहीं कर सकते हैं। उनकी ResolverActivity एक ब्रॉडकास्ट रिसीवर पंजीकृत करता है, लेकिन हमेशा इसे अपंजीकृत नहीं करता है।

अधिक विस्तार:

Intent.createChooser() एक ResolverActivity शुरू कर देंगे। onCreate में(), गतिविधि कॉल

mPackageMonitor.register(this, false); 

mPackageMonitor एक BroadcastReceiver है और register() भीतर यह गतिविधि पर ही पंजीकृत करता है। आम तौर पर, रिसीवर onStop() में अनियंत्रित है। हालांकि, बाद में onCreate() में कोड यह जांचता है कि उपयोगकर्ता कितने विकल्प चुन सकता है। यदि केवल एक है तो यह finish() पर कॉल करता है। चूंकि finish() को onCreate() में बुलाया जाता है, इसलिए अन्य जीवन चक्र विधियों को कभी नहीं कहा जाता है और यह सीधे onDestroy() पर कूदता है - रिसीवर को लीक करता है।

मुझे एंड्रॉइड समस्या डेटाबेस में इसके लिए कोई बग नहीं दिखाई देता, इसलिए मैं created one

अधिक जानकारी के लिए आप कोड में देख सकते हैं:

एक तरफ ध्यान दें के रूप में, गूगल की जब आप नहीं चाहेंगे कि एक उदाहरण के रूप में ईमेल का उपयोग करता है एक चयनकर्ता का उपयोग करें ताकि आप सामान्य रूप से इरादे को लॉन्च करने पर विचार कर सकें। Intent#ACTION_CHOOSER के लिए javadocs देखें।

+0

क्या आपके पास Google के लिए एक लिंक संदर्भ है, ईमेल का चयन न करें? – Blundell

+0

यह इरादा # ACTION_CHOOSER के लिए javadocs में है। आप उपरोक्त लिंक का उपयोग कर सकते हैं या ग्रहण में उन्हें देख सकते हैं। – blazeroni

+1

एफवाईआई, यह एंड्रॉइड 4.4 पर हो रहा है, इस पर ध्यान दिए बिना कि कितने विकल्प हैं। उदाहरण के लिए इरादा प्रकार को "टेक्स्ट/एचटीएमएल" में बदलें, लेकिन यह उन ऐप्स की संख्या को भी सीमित करता है जिन्हें वास्तव में साझा किया जा सकता है। कोई विचार क्यों एंड्रॉइड 4.4 इसका कारण बन रहा है? – clu

4

समस्या का सरल समाधान।

अधिक यहाँ जानकारी: https://developer.android.com/training/basics/intents/sending.html

Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California"); 
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location); 

PackageManager pkManager = getPackageManager(); 
List<ResolveInfo> activities = pkManager.queryIntentActivities(mapIntent, 0); 

if (activities.size() > 1) { 
    // Create and start the chooser 
    Intent chooser = Intent.createChooser(mapIntent, "Open with"); 
    startActivity(chooser); 

    } else { 
    startActivity(mapIntent); 
} 
संबंधित मुद्दे