क्या पृष्ठभूमि प्रक्रिया सेवा बनाने के लिए वैसे भी है जो चलाएगा कि ऐप बनाया गया है या नहीं, यह अभी भी चल रहा है?

इसलिए, मैं चाहता हूं कि मेरा ऐप एक ऐसी सेवा तैयार करे जो प्रारंभ में पृष्ठभूमि में चलाए और कुछ सामान करे। यह पृष्ठभूमि प्रक्रिया कभी नहीं रुक जाएगी। यह लगातार चल रहा है। पृष्ठभूमि प्रक्रिया को बनाया या नष्ट करने का एकमात्र तरीका ऐप के माध्यम से होगा। मैं समझता हूं कि प्रक्रिया को मारने के लिए अनंत संभावनाएं हैं। मुझे लगता है कि मैं चाहता हूं कि मेरा ऐप मुझे यह बताने में सक्षम हो कि प्रक्रिया चल रही है या नहीं और उस प्रक्रिया से वास्तविक समय की जानकारी पुनर्प्राप्त करें। इसके साथ, पृष्ठभूमि प्रक्रिया शुरू करने और/या नष्ट करने में सक्षम हो।

तो, मान लें कि आप ऐप खोलना चाहते हैं और सेवा शुरू करना/बनाना चाहते हैं। यहां तक ​​कि जब आप ऐप के लिए डेस्ट्रॉय को बंद/टर्मिनल/कॉल करते हैं, तब भी मैं पृष्ठभूमि प्रक्रिया को चलाना चाहता हूं। इस सेवा को नष्ट करने का एकमात्र तरीका ऐप को फिर से खोलना/पुनः बनाना होगा, और इसे नष्ट करना होगा।

क्या एंड्रॉइड ऐसा कुछ करने की इजाजत देता है? क्या इस से निकाल पाने के लिए कोई तरीका है?

मैं एक IntentService बनाने जा रहा था और इसे एक अनंत लूप चलाता था। हालांकि, मेरी एकमात्र समस्या यह है कि IntentService से जानकारी कैसे प्राप्त करें। जो मैंने सीखा है, उससे एक IntentService बनाया गया है और इसे पूरा होने पर खुद को मार देता है।

मैं अभी भी एंड्रॉइड के लिए नया हूं, इसलिए विशिष्ट और/या उपचारात्मक होने में संकोच न करें।

0
क्या आपने यह गाइड पढ़ा? developer.android.com/guide/components/services.html
जोड़ा लेखक Rafael T, स्रोत

5 उत्तर

Just make 2 apps. one a service and one an app. (since the service & the app run on the 'UI' thread).. That way you have two separate processes. Use aidl to communicate between the two.. Would not use intent service, those are supposed to be short lived.

0
जोड़ा
हालांकि इसके साथ समस्या यह है कि ओएस को संसाधनों की आवश्यकता होने पर ओएस हमेशा सेवा को मार सकता है, इसलिए केवल आपके ऐप को सेवा को मारना संभव नहीं है। एक अलग "ऐप" बनाना जो सिर्फ एक सेवा है, वह मूर्खतापूर्ण और अनियंत्रित लगता है क्योंकि आप इसे केवल एक सामान्य ऐप में शुरू और रोक सकते हैं
जोड़ा लेखक tyczj, स्रोत
@RobAveryIV आप सामान्य रूप से अपने ऐप में सेवा शुरू करके और उस सेवा के लिए बाध्यकारी करके यह ठीक कर सकते हैं
जोड़ा लेखक tyczj, स्रोत
मैं अनुमान लगा रहा हूं कि "सेवा" ऐप सामान्य ऐप की तरह कार्य नहीं करेगा? क्या आप इसे ऐप ड्रॉवर में देख पाएंगे?
जोड़ा लेखक Rob Avery IV, स्रोत
@tyczj मैं समझता हूं कि प्रक्रिया को मारने के लिए अनंत संभावनाएं हैं। मुझे लगता है कि मैं चाहता हूं कि मेरा ऐप मुझे यह बताने में सक्षम हो कि प्रक्रिया चल रही है या नहीं और उस प्रक्रिया से वास्तविक समय की जानकारी पुनर्प्राप्त करें। इसके साथ, पृष्ठभूमि प्रक्रिया शुरू करने और/या नष्ट करने में सक्षम हो।
जोड़ा लेखक Rob Avery IV, स्रोत

आपको इसके लिए 2 ऐप्स बनाने की ज़रूरत नहीं है, वास्तव में, यदि आपकी आवश्यकता केवल मुख्य ऐप से सेवा को रोकने/बनाने में सक्षम है, तो यह केवल चीजों को अधिक जटिल करेगी (जैसे कि आपको इसकी सभी की सहायता नहीं चाहिए एक ही ऐप), जो उपरोक्त उत्तर के लिए जाता है (अभी तक जवाब नहीं दे सकता!)।

अन्य गतिविधियों के समान पैकेज पर भी ऐप और सर्विस क्लास बनाएं। फिर मैनिफेस्ट एक्सएमएल पर इस तरह की सेवा को एप्लिकेशन नोड पर पंजीकृत करें:

 
        
            
        
    

एंड्रॉइड के साथ आप क्या कर रहे हैं: प्रक्रिया = ": रिमोट" टैग स्पष्ट रूप से एक अलग प्रक्रिया ('रिमोट' के नाम से) में चलाने के लिए सेवा को सेट कर रहा है, जबकि बाकी ऐप की तुलना में बाकी ऐप की तुलना में।

फिर, इसे शुरू करने और रोकने के लिए बस इन्हें अपनी गतिविधि से उपयोग करें:

startService(new Intent(this, Service.class));

· · ·

stopService(new Intent(this, Service.class));

सुनिश्चित करें कि आप सेवाओं (और ब्रॉडकास्ट्रेवर) के बारे में प्रलेखन को वैसे भी पढ़ते हैं, लेकिन यह आपको एक सामान्य विचार देगा कि कहां लक्षित करना है और क्या करना है।

मैं हाल ही में सेवाओं के साथ काम कर रहा हूं इसलिए इस मामले पर ताजा हूं, अगर आपके कोई प्रश्न हैं तो मुझे यहां बताएं!

<<<<<<<<<<<< EDIT : >>>>>>>>>>>>>>>

आह मुझे लगता है कि मैं अब आपको प्राप्त करता हूं .. यदि आप नहीं चाहते हैं कि "ऐप" समाप्त होने के बाद सेवा जारी रहेगी तो बस रिमोट पार्ट के बारे में भूल जाएं। इस तरह वे दोनों एक ही ऐप लाइफसाइकिल साझा करेंगे (लेकिन संदर्भ जीवनशैली के रूप में उनके पास अलग-अलग नहीं हैं), क्षमा करें अगर उस हिस्से ने आपको भ्रमित कर दिया और वोट के लिए धन्यवाद!

0
जोड़ा
तो, मेरी ऐप (गतिविधि) एक पृष्ठभूमि प्रक्रिया (सेवा) बनाता है। फिर, मेरी ऐप नष्ट हो गई है (ऑनस्ट्रोय) और पृष्ठभूमि प्रक्रिया अभी भी चल रही है?
जोड़ा लेखक Rob Avery IV, स्रोत
तो, मेरे पहले टिप्पणी प्रश्न से जारी रखने के लिए, अब मेरी ऐप नष्ट हो गई थी और मेरी सेवा अभी भी चल रही है। जब मैं ऐप को दोबारा खोलता/फिर से बना देता हूं, तो कोड <कोड> स्टॉप सेवा (नया इरादा (यह, सेवा.क्लास)) की रेखा का उपयोग करें; , यह उस सेवा के उसी उदाहरण को मार देगा जिसे मैंने पहली बार खोला था अप्प?
जोड़ा लेखक Rob Avery IV, स्रोत
हां, मूल रूप से।
जोड़ा लेखक SuppressWarnings, स्रोत
मैं आपको इस ट्यूटोरियल की अनुशंसा करता हूं: vogella.com/articles/AndroidServices/article.html यह बहुत अच्छा और अद्यतित है
जोड़ा लेखक SuppressWarnings, स्रोत
आप BOOT_COMPLETED को संभालने के लिए ब्रॉडकास्टसीवर भी सेट कर सकते हैं और यह सुनिश्चित करने के लिए सेवा शुरू कर सकते हैं कि डिवाइस रीबूट के बाद भी चल रहा है। ऐप चलाने के बिना सब कुछ। बस याद रखें कि भले ही सेवा और अन्य गतिविधियां विभिन्न प्रक्रियाओं में चलती हैं, फिर भी यह सेवा अभी भी उस ऐप से मैनिफेस्ट के माध्यम से बाध्य है। जैसा कि आप अनुमान लगा सकते हैं कि सेवाएं बहुत शक्तिशाली संसाधन हैं लेकिन आपको उन्हें सही तरीके से संभालने की आवश्यकता है और केवल अपनी कार्यक्षमता को अपनी नंगे आवश्यकताओं तक बढ़ाएं, क्योंकि अन्यथा यह बैटरी और/या संसाधनों को बहुत तेजी से निकाल सकता है।
जोड़ा लेखक SuppressWarnings, स्रोत
एक और बात यह है कि एंड्रॉइड सिस्टम द्वारा किसी भी समय "आवश्यकता" (जैसे मेमोरी लीक, जिसे सिस्टम बैटरी-लाइफ सेटिंग्स के रूप में परीक्षण किया जाता है, जो इसे प्रभावित कर सकता है) द्वारा एक सेवा को बंद कर दिया जा सकता है।
जोड़ा लेखक SuppressWarnings, स्रोत
हाँ, यदि आप एंड्रॉइड सेट करते हैं तो सेवा एक अलग प्रक्रिया है: प्रक्रिया = ": रिमोट"। आप इसे क्लास पॉइंटर द्वारा इंस्टॉल/बंद कर सकते हैं (इंस्टॉलेशन नहीं)। हालांकि अगर आप एक अलग प्रक्रिया में सेवा नहीं करना चाहते हैं तो मेरी मुख्य पोस्ट पर संपादित करें।
जोड़ा लेखक SuppressWarnings, स्रोत
अगर मेरे उत्तर ने आपकी मदद की, तो क्या आप कृपया मेरे लिए सही उत्तर टैग सेट कर सकते हैं? बुरी तरह से प्रतिनिधि की जरूरत है! धन्यवाद = पी
जोड़ा लेखक SuppressWarnings, स्रोत
@SuppressWarnings आप सादा गलत हैं। : दूरस्थ एक निजी प्रक्रिया बनाता है, जिसे ऐप की मुख्य प्रक्रिया के साथ नष्ट कर दिया जाएगा। सेवा को ऐप से स्वतंत्र होने देने के लिए इसे कम से कम अपनी (वैश्विक) प्रक्रिया में रहना चाहिए।
जोड़ा लेखक Aleks N., स्रोत

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

0
जोड़ा
मुझे SupressWarnings नहीं मिल रहा है .....
जोड़ा लेखक Rob Avery IV, स्रोत
संभवतः उसने आपको यह नहीं बताया कि आपको IntentService की बजाय सेवा कक्षा से विस्तार करना चाहिए। और फिर आपको ऑनस्टार्ट कमांड विधि को ओवरराइड करना चाहिए और वहां अपना तर्क लागू करना चाहिए। आधिकारिक एंड्रॉइड दस्तावेज पढ़ें और यह आपको सेवा अवधारणा को बेहतर समझने में मदद करेगा।
जोड़ा लेखक Leandro Glossman, स्रोत

जवाब काफी सरल है।

  • Create a Service (not IntentService, just a simple Service) and start it from your activity. IntentService will not work in your case as it will call stopSelf() on itself as soon as you return from onHandleIntent()
  • Your service will continue to run till somebody explicitly calls stop method on it or service itself calls stopSelf() method. But in low memory conditions, platform can kill your background services. When device has enough memory platform will restart your service provided you make your service STICKY by returning START_STICKY in onStartCommand().
  • call stopService() from your activity when required. It doesn't matter even if your activity got stopped/killed and restarted.
  • You dont really require to launch your service in another process. Because platform will make sure to start and keep your application process alive as long as any of its entities (Activities, Services, Receivers) are alive. Dont worry, your application will not appear in running apps list if your process is running but none of its activities are alive.

उम्मीद है कि यह आपके प्रश्न का उत्तर देगा।

0
जोड़ा

मैं एक ही समस्या में भाग गया और मैंने नियमित <कोड> सेवा के onStartCommand() के अंदर startForeground() को कॉल करके इसे ठीक किया, IntentService । मैं अनुशंसा करता हूं कि आप उपरोक्त वर्णित नियमित <कोड> सेवा पर स्विच करें।

मेरा कोड यहाँ है। इस विधि को अपने onStartCommand() में कॉल करें:

final int id = 1234;
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendIntent = PendingIntent.getActivity(this, 0, intent, 0);

//Build the notification
Notification.Builder builder = new Notification.Builder(getBaseContext());
builder.setContentIntent(pendIntent);
builder.setSmallIcon(R.drawable.ic_launcher);
builder.setTicker("message");
builder.setWhen(System.currentTimeMillis());
builder.setAutoCancel(false);
builder.setContentTitle("Test Service");
builder.setContentText("message");

Notification notification = builder.build();

//start foreground service
startForeground(id, notification);
0
जोड़ा