2011-04-07 13 views
8

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

public class MyService extends Service implements SensorEventListener { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
       /* Register this SensorEventListener with Android sensor service */ 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     /* Unregister SensorEventListener */ 
     } 

    /* SensorEventListener Implementation ************************/ 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) {} 

    /* Receives callback when sensor values change */ 
    @Override 
    public void onSensorChanged(SensorEvent event) { 
     /* Determine if moving & then call stopSelf() to shut service down */ 
    } 
} 

मैं एक और समस्या है, तथापि, में है कि अपने आवेदन एक दूसरे सेवा है जो किसी भिन्न समय पर शुरू हो जाती है है। जहां तक ​​मुझे पता है, दोनों सेवाओं को एक ही थ्रेड में चलाया जाएगा, जो कि अच्छा नहीं है क्योंकि वे संघर्ष कर सकते हैं।

मुझे यह जानने की ज़रूरत है कि एक ही एप्लिकेशन में एक से अधिक सेवा चलाने के लिए एक सुरक्षित तरीका है। मैंने मानक सेवा वर्ग की बजाय IntentService का उपयोग माना है। मुझे पता है कि इन्हें आमंत्रण संभालने के लिए अपने स्वयं के कार्यकर्ता धागे को लागू किया गया है। समस्या यह है कि मुझे नहीं पता कि मैं एक इंटेंट सेवा के भीतर से सेंसरएवेंट लिस्टनर द्वारा आवश्यक एसिंक्रोनस कॉलबैक के प्रकार को कैसे कार्यान्वित कर सकता हूं। इसे एक और तरीके से रखने के लिए, मुझे कोई गारंटी नहीं है कि सेंसरशैंग पर एक विधि को कॉलबैक प्राप्त होगा इससे पहले कि IntentService अपना काम पूरा कर लेता है और बंद हो जाता है।

इस समस्या के समाधान के लिए किसी भी सुझाव की अत्यधिक सराहना की जाती है।

+0

आपको कॉमन्स के उत्तर को सही के रूप में चिह्नित करना चाहिए। :) – accordionfolder

उत्तर

8

क्योंकि वे संघर्ष कर सकते थे।

कैसे?

मैं, अगर वहाँ एक साथ एक ही आवेदन

एक साथ एक ही आवेदन के भीतर एक से अधिक सेवा करने में कोई आंतरिक समस्या है के भीतर एक से अधिक सेवा को चलाने के लिए एक सुरक्षित तरीका है पता करने की जरूरत एक ही आवेदन में एक से अधिक गतिविधियों में एक आंतरिक समस्या से कहीं अधिक है।

इस समस्या के समाधान के लिए किसी भी सुझाव की अत्यधिक सराहना की जाती है।

आपने कोई समस्या नहीं दिखाई है।

+0

@CommonsWare, उत्तर देने के लिए समय लेने के लिए धन्यवाद। अंत में, मेरा प्रश्न खराब वाक्यांश है ... मुझे दोबारा दोहराएं। अगर मैं दो अलग-अलग सेवाओं (विभिन्न कार्यक्रमों पर) का आह्वान कर रहा हूं, तो क्या ये दोनों मुख्य रूप से मुख्य एप्लिकेशन (UI) थ्रेड में शुरू नहीं हुए हैं? यदि इन सेवाओं के आविष्कार ओवरलैप होते हैं, तो परिणाम क्या हैं (यदि कोई हैं)? क्या दोनों सेवाएं बिना किसी कठोर नतीजे के अपने काम (अनिर्दिष्ट आदेश में) कर सकती हैं? – user522210

+0

मेरी समझ कहती है कि चूंकि दोनों सेवाएं मुख्य धागे पर चल रही हैं, इसलिए पहली सेवा ट्रिगर की जाएगी जबकि अगला वाला मुख्य थ्रेड के लिए संदेश कतार पर रखा जाएगा और बाद में लिया जाएगा। इसके अलावा, अगर पहली सेवा बहुत अधिक समय लेती है तो एएनआर फेंक दिया जा सकता है। (मुझे इस बारे में निश्चित नहीं है, लेकिन ब्रॉडकास्ट रिसीवर के लिए प्रलेखन का कहना है कि अगर रिसीवर 10 सेकंड में खत्म नहीं होता है तो एएनआर फेंक दिया जाएगा।) – advantej

+0

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

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