2010-12-14 11 views
18

यह जांचने का सबसे अच्छा तरीका क्या होगा कि कोई एंड्रॉइड सेवा चल रही है या नहीं? मुझे ActivityManager एपीआई के बारे में पता है, लेकिन ऐसा लगता है कि एपीआई के उपयोग की तरह मेरे परिदृश्यों के लिए सलाह नहीं दी जाती है (source)। मैं सेवा की स्थिति को बनाए रखने के लिए वैश्विक/लगातार चर का उपयोग करने की संभावना से भी अवगत हूं।एंड्रॉइड: जांचें कि क्या सेवा चल रही है या नहीं। bindService

मैं 0 करने के लिए सेट झंडे के साथ bindService उपयोग करने के लिए कोशिश की है, लेकिन मैं स्रोत लिंक (एकमात्र अपवाद था, मैं एक स्थानीय सेवा के साथ bindService कोशिश कर रहा था) पर व्यक्ति के रूप में एक ही समस्याओं मिल गया।

निम्नलिखित कॉल

getApplicationContext().bindService(new Intent(getApplicationContext(), 
     MyService.class), mServiceConnection, 0); 

हमेशा सच दिखाए, लेकिन जुड़ा हुआ नहीं होती है। क्या यह अपेक्षित व्यवहार है? ऐसा लगता है कि bindService को झूठी वापसी करनी चाहिए यदि सेवा पहले से चल रही नहीं है (यह नहीं है, मैंने इसे चेक किया है) या यदि BIND_AUTO_CREATE ध्वज सेट नहीं है (फिर से, यह नहीं है)।

उत्तर

10

मेरे पास एक ही समस्या है; ऐसा लगता है कि सबसे अच्छा ज्ञात समाधान जो भी सेवा सेवा में सार्वजनिक स्थैतिक बूलियन बनाना है, ऑनरेट्रॉइड के दौरान क्रिएट (या ऑनस्टार्ट कमांड, अपनी पसंद) के दौरान सत्य पर सेट किया गया है। फिर आप उसी एपीके में किसी भी अन्य वर्ग से इसका उपयोग कर सकते हैं। हालांकि यह दौड़दार हो सकता है। यह जांचने के लिए एंड्रॉइड के भीतर कोई एपीआई नहीं है कि कोई सेवा चल रही है या नहीं (साइड इफेक्ट्स के बिना): http://groups.google.com/group/android-developers/browse_thread/thread/8c4bd731681b8331/bf3ae8ef79cad75d

मुझे लगता है कि दौड़ की स्थिति इस तथ्य से आती है कि ओएस किसी भी समय रिमोट सेवा (किसी अन्य प्रक्रिया में) को मार सकता है । ऊपर दी गई एक स्थानीय सेवा (एक ही प्रक्रिया) की जांच करना, मुझे रेस-फ्री लगता है - यदि ओएस सेवा को मारता है, तो यह भी अपनी स्थिति की जांच करता है।

0

यदि सेवा चल रही है या नहीं चल रही है तो आप क्या करने की योजना बना रहे हैं? क्यों न केवल startService() पर कॉल करें। अगर यह नहीं चल रहा है तो यह इसे बनाएगा, और यदि यह है तो यह ऑनस्टार्ट() विधि को कॉल करेगा।

+1

का उपयोग कर के कि मैं करूंगा मान लीजिए किया एक संदेश मुद्रित करना चाहते हैं "सेवा चल रही है" या "सेवा नहीं चल रही है"। यही कारण है कि अगर सेवा चल रही है या नहीं तो मुझे जानकारी प्राप्त करनी है। मैं startService को कॉल करने के साथ ऐसा नहीं कर सकता। – Igor

+0

लेकिन आपको यह संदेश क्यों प्रिंट करना है? सेवा केवल नहीं चल रही है, तो केवल 2 चीजें हैं जो आप कर सकते हैं। या तो इसे शुरू करें या नहीं। – Falmarri

+1

क्योंकि यदि सेवा चल रही है या नहीं, तो मैं उपयोगकर्ता को सूचित करना चाहता हूं। उपयोगकर्ता को मैन्युअल रूप से सेवा शुरू और बंद करनी चाहिए (एक बटन दबाकर)।जब उपयोगकर्ता गतिविधि (बैक बटन) बंद कर देता है, तो सेवा चलनी चाहिए। और गतिविधि को पता होना चाहिए, जब उपयोगकर्ता अगली बार इसे शुरू करता है, तो सेवा पहले ही चल रही है। – Igor

1

मुझे वही आवश्यकता थी और पाया कि चल रहा है। कुछ और पहले से बाध्य सेवा, इससे पहले त्रुटियां होती हैं। मैंने दौड़ने से पहले यह सही किया। बाइंड सर्विस

try{ 
    context.unbindService(fetch_connection); 
} catch (IllegalArgumentException e){ 
    System.out.println("Unbinding didn't work. little surprise"); 
} 
+0

यह सिर्फ जांच करता है कि क्या आप सेवा के लिए बाध्य हैं। अगर यह शुरू हो गया है या नहीं। – Falmarri

11

उपयोग एक साझा वरीयता सेवा चल ध्वज को बचाने के लिए।

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    int res = super.onStartCommand(intent, flags, startId); 
    setRunning(true); 
    return res; 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    setRunning(false); 
} 

private void setRunning(boolean running) { 
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    SharedPreferences.Editor editor = pref.edit(); 

    editor.putBoolean(PREF_IS_RUNNING, running); 
    editor.apply(); 
} 

public static boolean isRunning(Context ctx) { 
    SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(ctx.getApplicationContext()); 
    return pref.getBoolean(PREF_IS_RUNNING, false); 
} 
+4

यह एक अच्छा विचार नहीं है, साझा किए गए संदर्भ गैर-अस्थिर भंडारण के लिए बने रहते हैं, इसलिए यदि किसी कारण से डिवाइस क्रैश हो जाता है या बिजली खो देता है तो आपके 'ऑनस्ट्रोय' को नहीं बुलाया जाएगा और अगली बार जब आप अपना ऐप स्टार्टअप करेंगे तो सोचेंगे कि सेवा चल रही है भले ही यह नहीं है। – satur9nine

+0

हां, मैं सहमत हूं। साझा किए गए संदर्भ इसके लिए नहीं हैं। लेकिन, एप स्टार्ट पर सर्विस रनिंग प्रीफ को हटाया जा सकता है। एक और तरीका: स्टोर ऑब्जेक्ट में ऑब्जेक्ट ऑब्जेक्ट में बूल var चल रहा है। –

+0

ऑन डेस्ट्रॉय हमेशा – Nepster

2

एक अन्य विधि:

public static boolean isServiceRunning(Context ctx, String serviceClassName) { 
    ActivityManager manager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (TrackingService.class.getName().equals(serviceClassName)) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

जब मैं उपरोक्त कोड का उपयोग करता हूं, तो यह मुझे केवल सिस्टम चलने वाली सेवाओं की जानकारी देता है। मैं जो भी बनाया है, सहित सभी सेवाओं की तलाश में हूं – user1810931

0
अपनी गतिविधि में

यू बस यह मेरे मामले में आपकी सेवा के कहने का उपयोग करके जाँच कर सकते हैं मैं इसे

button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      Intent intent=new Intent(MainActivity.this, MyService.class); 
      //startService(intent); 
      bindService(intent,serviceConnection,BIND_AUTO_CREATE); 
      if (myService!=null) 
      { 
       myService.RecData(editText.getText().toString()); 
      } 
     } 
    }); 
} 

ServiceConnection serviceConnection=new ServiceConnection() { 
    @Override 
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) { 
     Toast.makeText(MainActivity.this,"onServiceConnected called",Toast.LENGTH_SHORT).show(); 
     MyService.MyBinder myBinder= (MyService.MyBinder) iBinder; 
     myService= myBinder.getServiceInstant(); 
     myService.SetActivity(MainActivity.this); 
     myService.RecData(editText.getText().toString()); 
    }