2011-09-30 4 views
5

के बीच इरादा संकल्प और अंतर मेरे इरादे के संकल्प और Intent.ACTION_PICK_ACTIVITY और Intent.ACTION_CHOOSER (इसके सुविधा फ़ंक्शन संस्करण, Intent.createChooser() सहित) के बीच का अंतर है।ACTION_CHOOSER और ACTION_PICK_ACTIVITY

मैं एक "पैकेज प्रबंधक" ऐप लिख रहा हूं। इसमें मेरे पास एक सूची गतिविधि है जो डिवाइस पर स्थापित सभी संकुल प्रदर्शित करती है (PackageManager.getInstalledPackages() के साथ आबादी)। मेरे पास सूची में पंजीकृत एक संदर्भ मेनू भी है, जिसमें से एक आइटम "लॉन्च" है।

नीचे "लॉन्च" संदर्भ मेनू आइटम को संभालने के लिए कॉनटेक्स्ट इटैम सेलेक्टेड() से मेरा कोड नीचे दिया गया है।

Intent intent ; 
List<ResolveInfo> ris ; 
int nLauchables ; 
int REQUEST_LAUNCH = 1 ; // for use in onActivityResult() 
// PackageInfo pi ;   // set outside this code 

intent = new Intent (Intent.ACTION_MAIN) ; 
intent.addCategory (Intent.CATEGORY_LAUNCHER) ; 
intent.setPackage (pi.packageName) ; // limit to launchable activities in the package represented by pi 

ris = getPackageManager().queryIntentActivities (intent, 0) ; // get list of launchable activities in pi 
nLaunchables = ris.size() ; 

if (ris == null || nLaunchables == 0) { 
// do nothing (in the real code, the "Launch" item is already disabled in this case, so this never happens) 
    } 
else if (nLaunchables == 1) { 
// only 1 launchable activity, so just start that activity 

    intent.setComponent (new ComponentName (ris.get (0).activityInfo.packageName, ris.get (0).activityInfo.name)) ; 

    startActivity (intent) ; 
    } 
else if (nLaunchables > 1) { 
// mutiple launchable activites, so let the user choose which one they want to launch 

// Intent chooseIntent = new Intent (Intent.ACTION_CHOOSER) ; 
// chooseIntent.putExtra (Intent.EXTRA_INTENT, intent) ; 
// chooseIntent.putExtra (Intent.EXTRA_TITLE, "Select activity") ; 
// startActivity (chooseIntent) ;          // doesn't show all launchable activities in the package 
// 
// or 
// 
// startActivity (Intent.createChooser (intent, "Select activity") ; // doesn't show all launchable activities in the package 

    Intent pickIntent = new Intent (Intent.ACTION_PICK_ACTIVITY) ; 
    pickIntent.putExtra (Intent.EXTRA_INTENT, intent) ; 

    startActivityForResult (pickIntent, REQUEST_LAUNCH) ; 
    } 

मैं पहली बार ACTION_CHOOSER संस्करण की कोशिश की ... लेकिन यह हमेशा पैकेज में सभी चलाने योग्य प्रोग्राम गतिविधियों नहीं दिखाती है। उदाहरण के लिए, Google मानचित्र में 4 लॉन्च करने योग्य गतिविधियां (अक्षांश, मानचित्र, नेविगेशन और स्थान) हैं जो ACTION_PICK_ACTIVITY के साथ दिखाई देती हैं लेकिन ACTION_CHOOSER केवल 2 (अक्षांश, मानचित्र) दिखाती है। केवल एक चीज जो मैं देख सकता हूं कि ACTION_CHOOSER का उपयोग करते समय दिखाए जाने वाले गतिविधियों के बीच अलग है और जो नहीं है कि उनके पास < इराद-फ़िल्टर> एस में CATEGORY_DEFAULT है। यदि इस सेटिंग को इसके बिना किसी भी गतिविधियों जब एक क्रिया करने के लिए सेट से छिपा होगा हिस्से में

Docs for CATEGORY_DEFAULT कहते हैं, ":

नीचे प्रलेखन कि मैं क्या समझने की सलाह ली के हिस्से हैं पर जा रहा है कुछ आंकड़े।"

यह व्यवहार मैं दिखाई दे रही है समझाने के लिए लगता है ... लेकिन ...

Docs for ACTION_CHOOSER कहते हैं, भाग में, "... सभी संभव गतिविधियों हमेशा की भले ही एक दिखाया जाएगा उन्हें वर्तमान में पसंदीदा गतिविधि के रूप में चिह्नित किया जाता है। " (जोर मेरा)

यह CATEGORY_DEFAULT के लिए ऊपर डॉक्स के साथ संघर्ष में हो रहा है और पता चलता है कि ACTION_CHOOSER और ACTION_PICK_ACTIVITY का उपयोग कर एक ही परिणाम का उत्पादन करना चाहिए। ... और ...

इरादों और इरादों के समाधान के लिए डॉक्स (क्षमा करें, एक नए उपयोगकर्ता के रूप में, मैं एक पोस्ट में 2 लिंक तक सीमित हूं, इसलिए मैं इससे लिंक नहीं कर सकता ... बस देखो "इरादा संकल्प" खंड में, "श्रेणी परीक्षण" उपधारा में), कुछ हद तक, "एंड्रॉइड प्रारंभिकता() को पारित सभी अंतर्निहित इरादों का इलाज करता है जैसे कि उनमें कम से कम एक श्रेणी है: android.intent.category.DEFAULT" (theroid.intent.category.DEFAULT "(CATEGORY_DEFAULT निरंतर)। इसलिए, जो गतिविधियां अंतर्निहित उद्देश्यों को प्राप्त करने के इच्छुक हैं, उन्हें एंड्रॉइड.intent.category.DEFAULT "को उनके इरादे फ़िल्टर में शामिल करना चाहिए। (एंड्रॉइड.intent.action.MAIN के साथ फ़िल्टर" और android.intent.category.LAUNCHER "सेटिंग्स अपवाद हैं। वे उन गतिविधियों को चिह्नित करते हैं जो नए कार्यों को शुरू करते हैं और जिन्हें लॉन्चर स्क्रीन पर प्रदर्शित किया जाता है। वे श्रेणियों की सूची में "android.intent.category.DEFAULT" शामिल कर सकते हैं, लेकिन) की आवश्यकता नहीं है "(जोर मेरा)

फिर से, यह स्पष्ट रूप से कहता है कि ACTION_CHOOSER और ACTION_PICK_ACTIVITY का उपयोग करके एक ही परिणाम उत्पन्न करना चाहिए।

तो, क्या यह ACTION_CHOOSER (यानी, यह उल्लेख नहीं करता है कि CATEGORY_DEFAULT गतिविधियों को बाहर रखा गया है) के लिए अपूर्ण दस्तावेज का मामला है या क्या कुछ और चल रहा है?

ACTION_PICK_ACTIVITY का उपयोग करना मेरे लिए काम करता है लेकिन इसके साथ startActivityForResult() को कॉल करने की आवश्यकता के कारण आदर्श नहीं है (केवल प्रारंभ गतिविधि() के बजाय)।

उत्तर

0

मुझे लगता है कि दस्तावेज से उन अंतिम दो अंशों का आपका अर्थ इरादा अर्थ नहीं है। ACTION_CHOOSER दस्तावेज़ से शुरू हो रहा है, "... सभी संभावित गतिविधियां हमेशा दिखाए जाएंगी, भले ही उनमें से एक को वर्तमान में पसंदीदा गतिविधि के रूप में चिह्नित किया गया हो," विशेष रूप से पसंदीदा गतिविधियों को संदर्भित करता है। आम तौर पर, जब आप एक अंतर्निहित इरादे का उपयोग करते हैं, और एक से अधिक गतिविधि मिलान करते हैं, यदि उपयोगकर्ता ने पहले इस उद्देश्य के लिए पिछले चयनकर्ता से "हमेशा" चुना है, तो आपको बिना किसी चयनकर्ता के गतिविधि मिल जाएगी। यदि आप ACTION_CHOOSER इरादे का उपयोग करते हैं, तो आपको सभी गतिविधियां मिलेंगी, भले ही किसी को चुना गया हो। यही वह पंक्ति है जिसका अर्थ है: "सभी संभावित गतिविधियां" का अर्थ है सभी गतिविधियां जो इरादे फ़िल्टर से मेल खाते हैं, श्रेणियों को भी ध्यान में रखते हैं। यह ACTION_CHOOSER का उपयोग कर स्वचालित रूप से बनाम बनाम अंतर प्राप्त करने के बीच अंतर का एक और स्पष्टीकरण है।

अन्य भाग जिसे आप कॉल करते हैं, लगभग android.intent.action.MAIN और android.intent.category.LAUNCHER, इसका मतलब यह नहीं है कि उस क्रिया और श्रेणी को विशेष रूप से इरादे फ़िल्टरिंग प्रक्रिया में संभाला जाता है। यह न भूलें कि इस दस्तावेज़ को पढ़ने वाले अधिकांश लोग बस लॉन्च करने योग्य ऐप्स लिख रहे हैं, और लॉन्चर में दिखाए गए गतिविधि को प्राप्त करने के लिए उनके मैनिफेस्ट में क्या रखना है, यह जानने की आवश्यकता है। यहां "अपवाद" इरादा फ़िल्टर नियमों का अपवाद नहीं है: यह सामान्य व्यवहार का अपवाद है कि अंतर्निहित इरादे CATEGORY_DEFAULT का उपयोग करते हैं, और यह केवल एक अपवाद है क्योंकि लॉन्चर्स ने CATEGORY_DEFAULT के बजाय इस श्रेणी (CATEGORY_LAUNCHER) को सेट किया है।

संक्षेप में, इरादे संकल्प का पूरा क्षेत्र काफी कम दस्तावेज है, जैसा कि आपने पाया है, लेकिन आपके द्वारा उल्लिखित उद्धरणों में कोई असंगतता नहीं है: वे बस कुछ अलग चीजों के बारे में बात कर रहे हैं।

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