2012-10-10 24 views
5

मैं एक गतिविधि के बजाय ऐप लॉन्च होने पर Service लॉन्च करना चाहता हूं; और फिर कहा कि सेवा an Activity लॉन्च करेगी। मुझे ऐसा करने की ज़रूरत है क्योंकि मेरे ऐप को हमेशा चलने की ज़रूरत है, और जब मैं हमेशा कहता हूं तो मेरा मतलब हमेशा होता है। और ओएस से बचने में मेरा एकमात्र तरीका है कि मैं अपने ऐप को मार रहा हूं, स्टिकी के रूप में सेवा शुरू कर रहा है और एंड्रॉइड को या तो मेरी गतिविधि या मेरी सेवा को मारना चाहिए, मैं उन्हें तुरंत पुनरारंभ करूंगा।ऐप से लॉन्च सेवा, गतिविधि

मुझे यह question मिला लेकिन शीर्ष उत्तर बदसूरत लगता है, किसी के पास कोई बेहतर विचार है?

पीएस: मुझे पता है कि यह एक बहुत ही अनुकूल ऐप की तरह नहीं दिखता है लेकिन यह एक बहुत ही विशिष्ट शोध परिदृश्य है और यह नियमित उपयोगकर्ताओं के लिए नहीं है, यानी फोन का उद्देश्य पूरी तरह से इस उद्देश्य के लिए उपयोग किया जाता है; लेकिन अगर मेरे ऐप को मेमोरी समर्पित है, तो एंड्रॉइड इसे हर समय मार रहा है और फिर ... एंड्रॉइड की कथित सख्त मेमोरी प्रबंधन योजना के बारे में मुझे कोई संदेह हो सकता है।

+0

तो आप को पता है कि कैसे एक सेवा शुरू करने के लिए करना चाहते हैं? – keyser

+0

@roadkarom: गतिविधि में ** नहीं ** यूआई है। गतिविधि में ** ** यूआई हो सकता है - और इससे बड़ा अंतर आता है। –

+0

अब मैं इसे नोटिस करता हूं। मेरी गलती। –

उत्तर

10

सामान्य गतिविधि को कोई यूआई दिखाने की ज़रूरत नहीं है - यह आमतौर पर करता है लेकिन यह अनिवार्य नहीं है। तो आप बस ऐप के शुरुआती बिंदु को अपनी "अदृश्य" गतिविधि में सेट कर सकते हैं। और अदृश्य साधन या तो

android:theme="@android:style/Theme.NoDisplay" 

या बस अपने कोड किसी भी setContentView() काम नहीं चलेगा के रूप में थीम पर आधारित है और एक बार यह काम अपने onCreate() में किया जाता है, तो आप एक गतिविधि शुरू करने और finish() के साथ इस एक को समाप्त - और कोई यूआई से पॉप अप होगा उस गतिविधि - इस तरह से आप आसानी से गतिविधि उपवर्ग में अपना काम कर रहे हैं (जो कुछ कार्यों के लिए आसान हो सकता) से लाभ और अभी भी कर सकते हैं किसी भी यूआई की जरूरत नहीं है:

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 

    // [... do your job here...] 

    // we're done, so let's jump to another acitivity 
    // this can be skipped if you do not want to jump anywhere 

    Intenet intent = new Intent(....) 
    ... 

    try { 
     startActivity(intent); 

     // finish him 
     finish(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 
+0

लेकिन फिर गतिविधि शुरू करना अनिवार्य है? उस कदम को छोड़ नहीं सकते? –

+2

@rodkarom: लॉन्चर आइकन हमेशा गतिविधियों से बंधे होते हैं। इसलिए, यदि आप किसी सेवा को ट्रिगर करने के लिए लॉन्चर आइकन चाहते हैं, तो लॉन्चर आइकन को उस गतिविधि को शुरू करने की आवश्यकता होती है जो सेवा को ट्रिगर करता है। यह निश्चित रूप से मानता है कि "जब ऐप लॉन्च किया जाता है" तो आपका मतलब है "जब उपयोगकर्ता लॉन्चर आइकन पर टैप करता है", क्योंकि "ऐप्स" एंड्रॉइड में "लॉन्च नहीं" होते हैं। – CommonsWare

+0

चाल यह है कि ऐप सिस्टम लॉन्च करने के लिए उस तत्व का आह्वान किया जाएगा जो इसे 'इरादा-फ़िल्टर' से जुड़ा हुआ है। सैद्धांतिक रूप से, इंटनेट-फ़िल्टर को गतिविधि, सेवा या प्रसारण के लिए असाइन किया जा सकता है, उस प्रकार की किसी भी वस्तु को लॉन्च किया जा सकता है (हालांकि मैंने लॉन्चर के इरादे के लिए गतिविधि के बगल में कुछ भी नहीं किया है)। फिर भी मुझे अपनी सेटअप नौकरी करने के लिए यूआई के बिना लॉन्च करने की कोई समस्या नहीं है। –

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