Android - Getting list of installed apps takes too long -


पहला प्रयास:

  आशय मुख्य पहचान = नया आशय (आशय। एक्शन_माइन, रिक्त); mainIntent.addCategory (Intent.CATEGORY_LAUNCHER); आशय pickIntent = नए आशय (Intent.ACTION_PICK_ACTIVITY); PickIntent.putExtra (Intent.EXTRA_INTENT, मुख्य इन्टेंट); यह चालू है। स्टार्ट एक्टिविटीफ़ोर रेसल्ट (पिक इंटेंट, मोर इकोन्स कंसल्टेंट्स। REQUEST_PICK_APPLICATION)   

औसत समय की आवश्यकता - & gt; 8-10 सेकंड

दूसरा प्रयास मैंने प्रोग्राम की सूची बनाएं और एक संवाद में सूची को स्वयं दिखाएं .----- & gt; लगभग 4 सेकंड ... तेज लेकिन अभी भी धीमा।

तीसरे प्रयास: मैं अपनी प्राथमिकता फाइल में सूची को संग्रहित करता हूं ताकि भविष्य में मैं उस सूची को तुरन्त लोड कर सकूं ... इस बीच पृष्ठभूमि में वर्तमान सूची प्राप्त करना और यदि मतभेद उपयोगकर्ता के लिए दिखाए जा रहे सूची को अपडेट करते हैं ---- इसके बारे में 4 सेकंड भी।

यह वह जगह है जहां यह अजीब हो जाता है लॉग स्टेटमेंट्स का उपयोग करके प्रत्येक पद्धति की आवश्यकता के अनुसार सटीक समय मापा। अगर मैं पहले प्राथमिकताओं से सूची लोड करता हूं और फिर पैकेज प्रबंधक से पूछता हूं तो मुझे वरीयताओं के तरीके के लिए 4 सेकंड लेता है और क्वेरी विधि के लिए 0.5 सेकंड

अगर मैं पैकेज प्रबंधक से पूछताछ की सूची लोड करता हूं पहले और फिर इसे प्राथमिकता विधि से लोड करने के लिए चार सेकंड का समय लगता है और वरीयता पद्धति के लिए 0.5 सेकेंड का समय लगता है

इसलिए कोई भी बात नहीं है कि मैं पहली बार क्या करता हूं, बहुत समय लगता है और दूसरा सही निष्पादित होता है दूर <।

क्या इस सूची को और तेजी से लोड करने के लिए कोई अन्य तरीका है?

मैंने दोनों विधियों के लिए अपने कोड का हवाला दिया

पैकेज प्रबंधक <पूर्व> निजी वर्ग AppAsyncCaller AsyncTask विस्तारित & lt; शून्य, शून्य, शून्य & gt; {@Override सुरक्षित शून्य पर PreExecute () {super.onPreExecute (); } @ ओवरराइड संरक्षित वॉयूम डोइनबैकग्राउंड (शून्य ... पैरामीटर) {ArrayList & lt; AppItem & gt; allAppsInDevice2 = नया ArrayList & lt; AppItem & gt; (); लंबे समय स्टार्ट = System.currentTimeMillis (); आशय मुख्य इंटेंन्ट = नए आशय (आशय। एक्शन_माइन, रिक्त) .addcategory (Intent.CATEGORY_LAUNCHER); सूची के & lt; ResolveInfo & gt; संकुल = pm.queryIntentactivities (मुख्य घटक, 0); के लिए (इंट आई = 0; आई & lt; packages.size (); i + +) {try {स्ट्रिंग पैकेजनाम = packages.get (i) .activityInfo.packageName; AppItem आइटम = getAppItem (पैकेजनाम, गलत); If (item! = Null) {allAppsInDevice2.add (item);}} कैच (अपवाद ई) {}} लॉग। W (लंबी.स्टस्ट्रिंग (सिस्टम। कंर्टटाइम मिलिसे () - टाइमस्टार्ट), "एसिंक कॉलर का उपयोग करने की अवधि"); वापसी नल; } @Override सुरक्षित शून्य पर पोस्टएक्सएक्टेक (शून्य परिणाम) {super.onPostExecute (परिणाम); }}

प्राथमिकताएं विधि से लोडिंग सूची:

  निजी वर्ग AppPrefsAsyncCaller AsyncTask को बढ़ाता है; शून्य, शून्य, शून्य & gt; {@Override सुरक्षित शून्य पर PreExecute () {super.onPreExecute (); } @ ओवरराइड संरक्षित वॉयूम डोइनबैकग्राउंड (शून्य ... पैरामीटर) {लंबे समय स्टार्ट = System.currentTimeMillis (); स्ट्रिंग allAppsListString = prefs.getString ("allAppsListString", ""); स्ट्रिंग [] टैब = allAppsListString.split ("_APAPPAPP_"); allAppsInDevice.clear (); बूलियन अपडेटअलेअप्स = झूठे; (स्ट्रिंग एस: टैब) के लिए (यदि (! S.equals ("") और amp; amp;! S.equals ("")) {AppItem आइटम = getAppItem (एस, गलत); अगर (आइटम! = नल) {allAppsInDevice.add (आइटम); }}} लॉग। W (लंबी.स्टोस्टिंग (सिस्टम सीरेंटटाइम मिलिसे () - टाइमस्टार्ट), "अवधि एपीओ प्रीफ"); वापसी नल; } @Override सुरक्षित शून्य पर पोस्टएक्सएक्टेक (शून्य परिणाम) {super.onPostExecute (परिणाम); }} सार्वजनिक AppItem getAppItem (स्ट्रिंग पैकेजनाम, बुलियन getIcon) {AppItem आइटम = नया AppItem (); item.packageName = PackageName; ApplicationInfo ai = नल; कोशिश {ai = pm.getApplicationInfo (पैकेजनाम, 0); } पकड़ (अंतिम NameNotFoundException ई) {वापसी नल; } अंतिम स्ट्रिंग एप्लिकेशननाम = (स्ट्रिंग) (ai! = Null? Pm.getApplicationLabel (ai): "(अज्ञात)"); item.appName = APPLICATIONNAME; आशय का इरादा = pm.getLaunchIntentForPackage (packageName); अगर (getIcon) {आरेखण आइकन = शून्य; अगर (इरादे! = नल) {try {icon = pm.getActivityIcon (आशय); } पकड़ (NameNotFoundException ई) {}} item.icon = icon; } वस्तु वापस; } सार्वजनिक वर्ग AppItem {String packageName; स्ट्रिंग ऐपनाम; ड्राइंग आइकन; }    

आप इसे एंड्रॉइड पैकेज मैनेजर के साथ कर सकते हैं।

नीचे एक छोटा कोड स्निपेट है।

  अंतिम PackageManager pm = getPackageManager (); // इंस्टॉल किए गए ऐप्स की एक सूची प्राप्त करें सूची के & lt; ApplicationInfo & gt; संकुल = pm.getInstalledApplications (PackageManager.GET_META_DATA); (ApplicationInfo packageInfo: संकुल) के लिए {लॉग डी। (टैग, "इंस्टॉल किए गए पैकेज:" + packageInfo.packageName); लॉग डी। (टैग, "एपीके फाइल पथ:" + पैकेज इन्फ़ोसाइट्स); }    

Comments

Popular posts from this blog

php - PDO bindParam() fatal error -

logging - How can I log both the Request.InputStream and Response.OutputStream traffic in my ASP.NET MVC3 Application for specific Actions? -

java - Why my included JSP file won't get processed correctly? -