2009-06-13 18 views
46

मैं एक ऐसा एप्लिकेशन बना रहा हूं जिसका एकमात्र घटक service है जो पृष्ठभूमि में चल रहा है (मूल रूप से प्रॉक्सी सर्वर) लेकिन मैं उस सेवा को कैसे शुरू करना है, इस तरीके से कोई रास्ता नहीं ढूंढ पा रहा हूं। एप्लिकेशन में कोई UI या उपयोगकर्ता इंटरैक्शन नहीं हो सकता है इसलिए मैं गतिविधि का उपयोग नहीं कर रहा हूं।
Broadcast receiver बूट प्रसारण सुन सकता है लेकिन जब मैं इसे स्थापित करता हूं तो पहली बार सेवा कैसे शुरू करूं और मैं इसे कैसे चला सकता हूं? या कोई प्रसारण है जिसे मैं ऐप इंस्टॉल करने के बाद सुन सकता हूं उदा। हो सकता है कि TIME_TICK हो लेकिन मुझे लगता है कि गतिविधि से पंजीकृत होना है।सेवा-केवल एंड्रॉइड ऐप कैसे शुरू करें

+1

मैंने इसे स्वयं नहीं किया है, लेकिन क्या एप्लिकेशन ऑब्जेक्ट से सेवा शुरू करना संभव होगा? – phreed

+0

मुझे लगता है कि यह काम करता है http://android-codes-examples.blogspot.com/2011/11/running-service-in-background-on.html – Android

उत्तर

43

दुर्भाग्य से अभी आपके आवेदकॉन स्थापित होने के बाद प्रसारण ईवेंट प्राप्त करने का कोई विश्वसनीय तरीका नहीं है, ACTION_PACKAGE_ADDED इरादा नए स्थापित पैकेज पर प्रसारित नहीं होता है।

ACTION_BOOT_COMPLETED ईवेंट प्राप्त करने के लिए आपको एक प्रसारण रिसीवर कक्षा और साथ ही अपनी सेवा भी होगी। मैं उस प्रसारण रिसीवर द्वारा पकड़े जाने के लिए ACTION_USER_PRESENT इरादे जोड़ने की भी सिफारिश करता हूं, इसके लिए एंड्रॉइड 1.5 (मिनीएसडीके = 3) की आवश्यकता होती है, जब भी उपयोगकर्ता अपने फोन को अनलॉक करता है तो यह आपके प्रसारण रिसीवर को कॉल करेगा। आखिरी बात यह है कि आप आसानी से बंद होने के बिना अपनी सेवा को चालू रखने की कोशिश करने के लिए कर सकते हैं, अपनी सेवा में Service.setForeground() पर कॉल करना है एंड्रॉइड को बताने के लिए तैयार करें कि आपकी सेवा को रोका नहीं जाना चाहिए, यह मुख्य रूप से एमपी 3 प्लेयर प्रकार के लिए जोड़ा गया था सेवाएं जो चलती रहती हैं लेकिन किसी भी सेवा द्वारा उपयोग की जा सकती हैं।

सुनिश्चित करें कि आप boot_complete और user_present ईवेंट के लिए उचित अनुमतियां प्रकट करते हैं।

यहां एक साधारण वर्ग है जिसे आप ईवेंट के लिए प्रसारण रिसीवर के रूप में उपयोग कर सकते हैं।

package com.snctln.util.WeatherStatus; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class WeatherStatusServiceReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     if(intent.getAction() != null) 
     { 
      if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) || 
       intent.getAction().equals(Intent.ACTION_USER_PRESENT)) 
      { 
       context.startService(new Intent(context, WeatherStatusService.class)); 
      } 
     } 
    } 
}; 

शुभकामनाएँ।

+7

अच्छी सलाह। Service.setForeground() के बारे में एक बात: यह अब एंड्रॉइड 2.0+ में काम नहीं करती है। सभी "दीर्घकालिक" सेवाओं को अब चल रहे समय अधिसूचना क्षेत्र में लगातार अधिसूचना की आवश्यकता है। यहां उदाहरण: http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/app/ForegroundService.html –

+2

ACTION_USER_PRESENT एक शानदार युक्ति है। मैं उम्र के लिए अपनी सेवा को जीवित रखने के साथ संघर्ष कर रहा हूं, और इसने इसे हल किया। – defrex

+0

ठीक है, यह एंड्रॉइड 4.0.x में और अधिक काम नहीं कर रहा है ... – ubuntudroid

14

Service.onStartCommand

में वापसी START_STICKY एंड्रॉयड आपकी सेवा को पुनः आरंभ करेगा

+2

START_STICKY केवल एंड्रॉइड 2.0+ – cow

+0

के लिए मान्य है लेकिन निरंतरता प्राप्त करने के लिए सेवा को कम से कम एक बार चलाने की ज़रूरत है? –

0

मैं एक ही मुद्दे पर शोध कर रहा हूँ। यहाँ है कि मैं क्या पाया है: http://kfb-android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html

सरल थोड़ा डेमो एक BroadcatReceiver और एक Service के बीच पिंगपांग का एक छोटा सा खेल कर एक समाधान से पता चलता है। रिसीवर ACTION_BOOT_COMPLETED प्राप्त करने के लिए मेनिफेस्ट में पंजीकरण करके बूट समय पर शुरू करने के लिए पंजीकृत है। यह ACTION_BOOT_COMPLETED प्राप्त करते समय बस एक सेवा शुरू करता है। बदले में Service पंजीकृत करता है तो ACTION_TIME_TICK के लिए।

ऐप तर्क BroadcastReceiver में लागू किया जाएगा।

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