2011-04-12 15 views
13

मैं अभिभावकीय नियंत्रण/वयस्क सामग्री फ़िल्टरिंग एप्लिकेशन पर काम कर रहा हूं। यह ऐप लगातार बच्चे के मोबाइल पर कॉल और एसएमएस पर नज़र रखता है और सभी गतिविधियों को सर्वर पर लॉग करता है। इसके लिए मैं BOOT_COMPLETED पर एक सेवा (MyService.java) शुरू कर रहा हूँ और सेवा के onCreate विधि में मैं callLog और एसएमएस uri के लिए एक contentobserver (नीचे दिए कोड स्निपेट को देखें) रजिस्टर।एंड्रॉइड सेवा में एक सामग्री ऑब्सर्वर पंजीकृत करना

अब मुद्दा यह है, जब से मैं हर निवर्तमान, आने वाली कॉल और एसएमएस मैं सेवा होना चाहता हूँ लगातार (बंद कर दिया/मार डाला जा रहा है बिना) चल निगरानी करना चाहते हैं। इसके अलावा इस सेवा का उपयोग सामग्री पर्यवेक्षकों को पंजीकृत करने के लिए किया जा रहा है और कोई अन्य प्रसंस्करण नहीं कर रहा है (इसकी ऑनस्टार्ट कमांड विधि डमी है), इसलिए एंड्रॉइड ओएस कुछ समय बाद सेवा को मार देता है। मैं कैसे सुनिश्चित करूं कि सेवा लगातार चलती है और सामग्रीबोधक वस्तु को जीवित रखती है?

 
public class MyService extends Service { 

    private CallLogObserver clLogObs = null; 
    public void onCreate() {   
     super.onCreate();  
     try{        
      clLogObs = new CallLogObserver(this); 
      this.getContentResolver().registerContentObserver(android.provider.CallLog.Calls.CONTENT_URI, true, clLogObs);    
     }catch(Exception ex) 
     { 
      Log.e("CallLogData", ex.toString()); 
     } 
    } 

    @Override 
    public IBinder onBind(Intent arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     if(clLogObs !=null ) 
     { 
      this.getContentResolver().unregisterContentObserver(clLogObs); 
     } 
     super.onDestroy(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId);   

     return Service.START_STICKY; 
    } 

    @Override 
    public boolean onUnbind(Intent intent) { 
     return super.onUnbind(intent); 
    } 
+2

लोग पहले ही इस बात पर टिप्पणी कर चुके हैं कि आप सेवा कैसे जारी नहीं रख सकते हैं, लेकिन चूंकि यह सेवा की तरह लगता है कि केवल सामग्री ऑब्सर्वर पंजीकृत करता है, ऐसा लगता है कि असली सवाल यह है कि क्या सेवा पर्यवेक्षक सेवा में मरते समय पंजीकृत रहते हैं (मुझे विश्वास है कि वे करें) और सेवा फिर से शुरू होने पर नए पर्यवेक्षक उदाहरणों को फिर से पंजीकृत करने से कैसे बचें। – spaaarky21

उत्तर

3

आप यह सुनिश्चित नहीं कर सकते कि आपकी सेवा एंड्रॉइड पर लगातार चल रही है।

उपयोग के मामले के लिए, आप ACTION_NEW_OUTGOING_CALL & SMS_RECEIVED जैसे ब्रॉडकास्ट रिसीवर पर भरोसा करना बेहतर है।

यदि आपको लगता है, समर्थित प्रसारण रिसीवर ऊपर अपने सभी उपयोग-मामले को कवर नहीं करता। समय-समय पर अपनी सेवा शुरू करने के लिए अलाराममेनगर का उपयोग करें और डेटा में किसी भी बदलाव के लिए CALL_LOGS और एसएमएस तालिका देखें और उचित कार्रवाई करें (इसमें CALL_LOGS और एसएमएस तालिका पर अंतिम बार देखे गए डेटा को चिह्नित करने में चेक शामिल हो सकता है)।

+0

धन्यवाद सुकुमार। चूंकि एंड्रॉइड सेवाओं को बाधा के बिना चलाने की अनुमति नहीं देता है, इसलिए प्रसारण रिसीवर के आधार पर ऐप को फिर से डिज़ाइन करना होगा। – Srao

-1

आप नहीं कर सकते गारंटी यह लगातार चलाया जाएगा, लेकिन आप जो गारंटी देता है कि एंड्रॉयड सेवाएं फिर से शुरू कर देंगे अगर यह किसी भी कारण से मार दिया जाता है onStartCommand से START_STICKY लौट सकते हैं।

2

आप अग्रभूमि में चलाने के लिए सेवा सेट कर सकते हैं। यह आपकी सेवा को ओएस द्वारा मारने का बहुत कम मौका देगा।

अधिक जानकारी के लिए here पढ़ें।

0

सामग्री पर्यवेक्षक जैसे ही आपकी सेवा मारे अपंजीकृत मिलता है। तो एक बार पंजीकरण करना एक विकल्प नहीं है और आपकी सेवा हर समय चलनी चाहिए। इसकी गारंटी के लिए आपको START_StICKY ऑनस्टार्ट कॉमांड से वापस जाना होगा। आप अग्रभूमि में सेवा भी शुरू कर सकते हैं।

लेकिन क्या होगा यदि सेवा की मौत हो जाने पर कोई नई कॉल आती है? इसे संभालने के लिए आप अपने ऐप की प्राथमिकताओं में अंतिम संसाधित _id स्टोर कर सकते हैं। और हर बार सहेजे गए आईडी से अधिक आईडी के साथ सभी नए कॉल लॉग प्राप्त करते हैं। आपको सेवा पर लॉग ऑन के साथ-साथ पर्यवेक्षक ऑन चेंज पर प्रक्रिया को संसाधित करना होगा।

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