2012-08-14 13 views
8

ढांचे के कुछ हिस्सों हैं जो अभी तक मेरे लिए बिल्कुल स्पष्ट नहीं हैं। मैं एक इनपुट इवेंट (कर्नेल -> इवेंटहब -> इनपुट रीडर -> इनपुट डिस्पैचर -> ...) के प्रवाह के साथ अच्छी तरह से जाना जाता हूं।एंड्रॉइड की हैंडलिंग (फ्रेमवर्क)

स्थिति

(आवश्यकताएँ:। एंड्रॉयड फ्रेमवर्क बदले बिना इनपुट कुंजियां संभाल) मैं किसी उपकरण (कुंजीपटल/गेमपैड/नियंत्रक/...) लेकिन से आ रही महत्वपूर्ण घटनाओं हैंडल करना चाहते हैं वहाँ कुछ आवश्यकताएं हैं एक के लिए, मैं एंड्रॉइड ढांचे को बदलना नहीं चाहता हूं। इसका मतलब है, मैं WindowManagerPolicy और उसके कार्यों जैसे interceptKeyBeforeDispatching को विस्तारित नहीं करना चाहता हूं जहां घर की कुंजी को संभाला जा रहा है। इसके परिणामस्वरूप मुख्य परत को एप्लिकेशन परत में भेजा जा रहा है जो ठीक है। नकारात्मकता यह है कि मेरे पास यहां एक और मुश्किल आवश्यकता है। उदाहरण: जब मैं गुस्सा पक्षी खेल रहा हूं और मैं अपने कनेक्टेड इनपुट डिवाइस पर अपना गोटो एल्फा-बटन दबाता हूं, तो अल्फा-एप्लिकेशन को शुरू करना होगा। गुस्से में पक्षियों के पास कोई सुराग नहीं है जो बटन GoToAlpha है, इसे संभाल नहीं पाएगा और पहचान नहीं पाएगा और उदाहरण के लिए मेरे अल्फा-एप्लिकेशन को शुरू करने के लिए प्रसारित कोई इरादा नहीं होगा।

प्रश्न

वहाँ एक रास्ता के बाद यह भेजा जा रहा है मेरी (कस्टम) महत्वपूर्ण घटना को संभालने के लिए है, जानते हुए भी कि अग्रभूमि में आवेदन कुंजी को संभाल नहीं कर सकते हैं?

मेरे (विफल) समाधान

  • एक सेवा है जो महत्वपूर्ण घटनाओं संभाल लेंगे बनाएँ। यह संभव नहीं है क्योंकि एंग्री बर्ड जैसे एप्लिकेशन मेरी सेवा से बंधे नहीं होंगे और महत्वपूर्ण घटना मेरी सेवा के अंदर नहीं पकड़ी जाएगी। यदि मैं गलत हूं, तो कृपया अधिक जानकारी प्रदान करें :)।

  • बाहरी पुस्तकालय बनाएं जहां मैं अपने एप्लिकेशन की गतिविधियों को अपने स्वयं के गतिविधिबेस से प्राप्त करने की अनुमति देता हूं। सभी महत्वपूर्ण घटनाओं और वहां डिफ़ॉल्ट व्यवहार को संभाला जा सकता है। डाउनसाइड, मौजूदा एप्लिकेशन मेरी कस्टम कुंजी घटनाओं का समर्थन नहीं करेंगे क्योंकि वे लाइब्रेरी का उपयोग नहीं करते हैं।

  • ढांचे को विस्तारित करना मेरी आंखों में सबसे साफ समाधान होगा, लेकिन इसके परिणामस्वरूप मेरी आवश्यकता पूरी नहीं होगी।

कोई मदद या उपयोगी जानकारी की सराहना की जाएगी

अतिरिक्त

पहला सवाल एक ही रास्ता या अन्य .. पर हल किया जा सकता है, तो मैं चाहते मेरी अनुकूलित करने के लिए GoToAlpha-button के पीछे Intent। इसका मतलब है .. डिफ़ॉल्ट रूप से अल्फा-एप्लिकेशन शुरू हो जाएगा लेकिन उपयोगकर्ता के पास इसे अनुकूलित करने के बाद, बीटा-एप्लिकेशन अब से शुरू हो जाएगा .. कोई भी विचार?

धन्यवाद

+0

यदि यह अन्य अनुप्रयोगों से महत्वपूर्ण घटनाओं को कैप्चर करना संभव है तो यह अजीब नहीं होगा? मुझे लगता है कि यह एक सुरक्षा जोखिम – Boy

+0

सच होगा। एक बार जब महत्वपूर्ण घटना ढांचे को छोड़ देती है, तो यह केवल एक आवेदन पर जाती है और वहां संभाला जाता है। यदि नहीं, तो यह ढांचे में वापस आ गया है। इसका मतलब यह होगा कि कोई समाधान नहीं है जो मेरी आवश्यकताओं को पूरा करेगा? – DroidBender

+0

मेरी राय में सुरक्षा समस्या के कारण शायद कोई रास्ता नहीं होगा: आपके ऐप पर कोई फोकस नहीं होने पर प्रमुख ईवेंट प्रबंधित करना। शायद एकमात्र तरीका होगा यदि आप एक एंड्रॉइड कीबोर्ड लागू करते हैं (मुझे उस पर कोई ज्ञान नहीं है)? यह महत्वपूर्ण घटनाओं को संभालने में सक्षम होना चाहिए (और जब आप किसी तृतीय पक्ष कीबोर्ड का चयन करते हैं तो उपयोगकर्ता इस सुरक्षा जोखिम पर भी ध्यान देते हैं) – Boy

उत्तर

3

टिप्पणी विक्टर के लिए धन्यवाद।

InputMethodService का उपयोग करके मुझे मेरी समस्याओं को संभालने के लिए पर्याप्त स्वतंत्रता और कार्यक्षमता प्रदान नहीं की जाएगी।

मेरे समाधान/समझौता

एंड्रॉयड ढांचे के भीतर, वहाँ एक PhoneWindowManager जो InputEvents से निपटने के लिए जिम्मेदार है। WindowManagerService जो SystemServer द्वारा शुरू किया गया है, इस प्रबंधक का मालिक है और एक उदाहरण बनाता है।

अपना खुद का कस्टम विंडोमैनेजर बनाकर और इसे एंड्रॉइड के PhoneWindowManager से प्राप्त करने दें, मुझे कोई डिफ़ॉल्ट कार्यक्षमता नहीं मिलती है और इससे मुझे इस कक्षा के भीतर अपना स्वयं का कार्यान्वयन जोड़ने की अनुमति मिलती है। यह परिणाम ढांचे में एक नई फ़ाइल जोड़ रहा है और एंड्रॉइड फ्रेमवर्क के अंदर केवल एक पंक्ति को बदल रहा है: WindowManagerServicePhoneWindowManager नहीं बनाएगा, लेकिन CustomPhoneWindowManager (फ़ोनविंडोमेनर को बढ़ाता है) बनाएगा।

यदि कोई बेहतर समाधान देखता है या मेरे समझौता के बारे में कोई विशिष्ट विचार है, तो टिप्पणी करने में संकोच नहीं करें। :)

+0

एक और विचार। मैंने इसके बारे में कहीं कहीं सुना है, लेकिन मुझे याद नहीं है कि परिणाम कहां और क्या थे। आप पारदर्शी विंडो बनाने की कोशिश कर सकते हैं जो सभी विंडोज़ के शीर्ष पर बैठेगा, इसलिए आपको सभी क्लिक/कीबोर्ड टाइपिंग मिल जाएगी। और अब, आपको इसे एप्लिकेशन पर भेजने की आवश्यकता होगी आपके पीछे है। इस तरह आप अन्य ऐप पर क्लिक भेजने के लिए "सभी इनपुट प्राप्त करने" से अपनी समस्या बदल सकते हैं। –

+1

यह एक खतरनाक दृष्टिकोण विक्टर है, क्या वह कुछ सुरक्षा मानकों के साथ संघर्ष नहीं करेगा :)? एक और समस्या, 'इनपुट एवेन्ट्स '(KEYCODE_HOME के ​​समान) हैं जो फ्रेमवर्क के अंदर पकड़े जाते हैं और एप्लिकेशन लेयर पर प्रेषित नहीं होते हैं। ये घटनाएं अदृश्य खिड़की में भी नहीं पहुंचेंगी।आपके समर्थन के लिए धन्यवाद! – DroidBender

+0

ओह .. हाँ .. यह खतरनाक है :) हालांकि, मेरा मानना ​​है कि व्यापार मूल्य 80% समय की सुरक्षा चिंताओं को रोकता है। मेरे पास संपूर्ण इनपुट विधि सेवा में बहुत सीमित अंतर्दृष्टि है (बस इसके अस्तित्व के बारे में जानें)। –

0

मुझे शक है कि यह सार्वजनिक एपीआई के साथ संभव है (लड़का और मार्टिन सुरक्षा चिंताओं ने बताया)।

अपने सबसे अच्छे दांव की तरह अधिकांश (यदि आप Android अनुकूलित करने के लिए नहीं करना चाहते हैं) होगा

क) InputMethodService उपयोग करने का प्रयास (http://developer.android.com/reference/android/inputmethodservice/InputMethodService .html)

यह उस तरह का नियंत्रण नहीं देता है जो आप चाहते हैं, लेकिन यह कुछ आवश्यकताओं के लिए पर्याप्त हो सकता है।

बी) पूरे ढेर (कर्नेल से एप्लिकेशन तक) के माध्यम से जाने का प्रयास करें और उपयोग करने के लिए कुछ भेद्यताएं पाएं।

यह निश्चित रूप से बहुत समय लगेगा और कोई फल लाने की गारंटी नहीं देता है।

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