2014-08-28 7 views
5

क्या ओएस द्वारा सेवा (स्टार्टफॉरग्राउंड) को मारने से रोकना संभव है? मैं इसे ऑडियो चलाने के लिए उपयोग करता हूं लेकिन जब मैं एक और ऐप का उपयोग करता हूं तो इसे मार दिया जाता है जिसके लिए थोड़ी देर के लिए अधिक संसाधन (गुस्सा पक्षी जाते हैं) की आवश्यकता होती है। लॉग में मैं गतिविधि प्रबंधक द्वारा ऐप प्रक्रिया को मार रहा हूं। मैंने कुछ अन्य ऑडियो ऐप्स के साथ भी दोहराया। केवल ऐप जो मारे नहीं है Play Music ऐप है। इसे सैमसंग एस 3 एंड्रॉइड 4.3 पर दोहराया गया था।संगीत सेवा शुरू होने पर भी मारे गए फोरग्राउंड

+0

यह उच्च प्राथमिकता ऐप द्वारा ऑडियो स्ट्रीम को लिया जा सकता है। – danny117

उत्तर

5

क्या सेवा (startForground) को ओएस द्वारा मारने से रोकना संभव है?

नहीं। यह एंड्रॉइड है जो निर्णय लेता है कि कौन सी प्रक्रिया को रोकना है। एकमात्र तरीका यह है कि इसे उपभोग करने वाली स्मृति की मात्रा को कम करके "रोकने के लिए कम आकर्षक" बनाना है।

स्मृति सहेजें। सेवा को अपनी छोटी प्रक्रिया में रखें। ताकि एंड्रॉइड ओएस स्मृति को पुनः प्राप्त करने के लिए मुख्य प्रक्रिया को मार सके और आपकी सेवा चलती रहती है। सेवा शुरू करने के लिए उपयोग किए गए इरादे से सेटिंग और वरीयताओं में गुजरकर एक छोटा सा सेवा कोड बनाए रखें।

नोट: छोटे सेवा एक अग्रभूमि सेवा होना चाहिए, जिसका अर्थ यह स्थिति पट्टी में एक आइकन दिखाने के लिए है। अलग प्रक्रिया सेवा को प्रारंभ करने के लिए इस्तेमाल के इरादे से सेटिंग में

 <service 
     android:name="com.gosylvester.bestrides.ServiceLocationRecorder" 
     android:process=":bestRidesService" > 
    </service> 
</application> 

पारित करने के लिए

प्रकट। सेटिंग बदलने के लिए बस सेवा को पुनरारंभ करें।

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    boolean isTrackerMarker = SettingMarker.TRACKER_MARKER_DEFAULT; 
    if (intent != null) { 
     // intent is processing = b 
     isMiles = intent.getBooleanExtra(
       SettingApplication.APPLICATION_MILE, 
       SettingApplication.APPLICATION_MILE_DEFAULT); 
     isRecordAccuracy = intent.getBooleanExtra(
       SettingRecord.RECORD_ACCURACY, 
       SettingRecord.RECORD_ACCURACY_DEFAULT); 
     locationInterval = intent.getLongExtra(SettingRecord.RECORD_MIlLIS, 
       SettingRecord.RECORD_PRESET_MEDIUM_MILLIS); 
     startMillis = intent.getLongExtra(BUNDLE_START_MILLIS, 0); 
     distance = intent.getDoubleExtra(
       ServiceLocationRecorder.BUNDLE_TRACKED_DISTANCE, 0); 
     recordDistance = (float) intent.getIntExtra(
       SettingRecord.RECORD_DISTANCE, 
       SettingRecord.RECORD_PRESET_MEDIUM_DISTANCE); 
     boolean newIsRecording = intent.getBooleanExtra(
       SettingRecord.RECORDING, isRecording); 

     isTrackerMarker = intent.getBooleanExtra(
       SettingMarker.TRACKER_MARKER, 
       SettingMarker.TRACKER_MARKER_DEFAULT); 
     startRecording(newIsRecording); 
    } 
+0

धन्यवाद। मैं इसे करने की कोशिश की। मैंने सेवा को विभिन्न प्रक्रियाओं में रखा लेकिन मुख्य प्रक्रिया के बाद मुझे एप्लिकेशन मैनेजर द्वारा भी मार दिया गया। मैंने android.os.Process.setThreadPriority (android.os.Process भी सेट किया है।THREAD_PRIORITY_AUDIO); लेकिन इससे मदद नहीं मिली – vandzi

+0

@vandzi माफ करना खोज रहा है मैं मदद करने में सक्षम नहीं था। – danny117

+0

मैंने उत्तर में थोड़ा और विवरण जोड़ा। छोटी सेवा एक अग्रभूमि सेवा होना चाहिए। इससे मारे जाने की संभावना कम हो जाती है। एंड्रॉइड के लिए कोई बेहतर समाधान नहीं है। –

1

क्या आपने फोकस का अनुरोध करने और नियंत्रण को नियंत्रित करने और खोने का प्रयास करने का प्रयास किया था? मुझे लगता है कि यह ऐप प्रबंधन हमारे नियंत्रण से बहुत दूर है, लेकिन कम से कम आप ऐसा कुछ कर सकते हैं जब ऐसा होता है।

अपने अनुप्रयोग चक्र के कुछ बिंदु पर, कुछ इस तरह का प्रयास करें:

audioManager.requestAudioFocus(new OnAudioFocusChangeListener() { 

     @Override 
     public void onAudioFocusChange(int focusChange) { 
      switch (focusChange) { 
       case AudioManager.AUDIOFOCUS_GAIN: 
        // you have the focus, you can start or restarting playing 
        break; 
       case AudioManager.AUDIOFOCUS_LOSS: 
       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: 
        // you lost the focus, you should pause or stop playing 
        break; 
       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: 
        // you lost the focus, but your app can continue playing in "duck" mode 
        break; 
       default: 
      } 

     } 
    }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 
+0

उत्तर के लिए धन्यवाद। मैं ऑडियोफोकस पकड़ता हूं – vandzi

0

Foreground service being killed by Android रॉबिन डेविस द्वारा की जवाब पर एक नजर डालें, वहाँ जानकारी का एक बहुत कुछ है:

बस संक्षेप में, यहां बताया गया है कि चीजों को कैसे काम करना चाहिए। चलने वाली सेवाओं को नियमित रूप से स्कैन किया जाएगा और हर 30 मिनट या उससे भी समाप्त कर दिया जाएगा। सेवाएं जो इस से अधिक समय तक जीवित रहना चाहती हैं उन्हें सेवा कॉल करना होगा। प्रारंभिक भूमि, जो अधिसूचना बार पर अधिसूचना रखती है, ताकि उपयोगकर्ता जान सकें कि आपकी सेवा स्थायी रूप से चल रही है और संभावित रूप से बैटरी जीवन को चूस रही है। केवल 3 सेवा प्रक्रियाएं किसी भी समय किसी भी समय अग्रभूमि सेवाओं के रूप में नामांकित कर सकती हैं। यदि तीन से अधिक अग्रभूमि सेवाएं हैं, तो एंड्रॉइड स्कावेन्गिंग और समाप्ति के लिए उम्मीदवार के रूप में सबसे पुरानी सेवा को नामांकित करेगा।

तो शायद 3 से अधिक अग्रभूमि सेवाएं हैं? अग्रभूमि सेवाओं को प्राथमिकता देते समय वह मंच में संभावित बग के बारे में भी समझाता है।

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