2010-03-18 9 views
37

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

मैं अपने गतिविधि सेट कर सकते हैं सेवा को सुनने जा करने के लिए? क्या यह इस समस्या से संपर्क करने का सबसे अच्छा तरीका है?

उदाहरण के लिए, यदि आप स्टॉक की कीमतों की एक सूची की कल्पना करते हैं - डेटा नियमित रूप से बदला जाएगा और लगातार (डेटा में) सेवा के साथ समन्वयित होने की आवश्यकता है।

अग्रिम

उत्तर

91

मैं अपनी गतिविधि को सेवा सुनकर कैसे स्थापित कर सकता हूं? क्या यह इस समस्या से संपर्क करने का सबसे अच्छा तरीका है?

आप तीन प्रमुख विकल्प हैं, के रूप में मैं इसे देखना:

  1. मतदान। Activity समय-समय पर नवीनतम डेटा के लिए Service पूछता है। आईएमएचओ, यह विकल्प बेकार है, लेकिन यह निश्चित रूप से संभव है।

  2. कॉलबैक। प्रति जैक्स के उत्तर, ActivityService के साथ एक कॉलबैक ऑब्जेक्ट ("पर्यवेक्षक") पंजीकृत करता है। डेटा बदलते समय Service कॉलबैक पर एक विधि को आमंत्रित करता है, जो बदले में यूआई को अपडेट करता है। आप Servicehere के साथ इसका उपयोग करने का एक उदाहरण देख सकते हैं।

  3. प्रसारण IntentsService डेटा परिवर्तन पर sendBroadcast() के माध्यम से Intent प्रसारित करता है। ActivityregisterReceiver() का उपयोग कर पंजीकृत करता है, और BroadcastReceiver किसी आने वाले प्रसारण की सूचना दी जाती है। यह Service से नवीनतम डेटा लोड करने के लिए Activity को ट्रिगर करता है, या संभवतः प्रसारण Intent प्रसारण में अतिरिक्त डेटा प्राप्त करने के लिए।आप Servicehere के साथ उस तकनीक का उपयोग करने का एक उदाहरण देख सकते हैं।

+11

यहां नंबर 3 का शानदार उदाहरण ... http://www.websmithing.com/2011/02/01/how-to-update-the-ui-in-an-android-activity-using-data-from- एक पृष्ठभूमि-सेवा/ –

+1

यदि मैंने एप्लिकेशन बंद कर दिया तो क्या होगा। मैं स्थिति गतिविधि के साथ AlarmManager चलाने के मामले को कैसे संभाल सकता हूं। – Basbous

+2

तकनीकों 2 और 3 के समर्थक और विपक्ष क्या हैं? –

4

पर्यवेक्षक पैटर्न लिए एक अच्छे उम्मीदवार की तरह इस ध्वनि धन्यवाद। असल में आपकी गतिविधि (ऑब्जर्वर) पृष्ठभूमि सेवा (अवलोकन योग्य) के साथ स्वयं पंजीकृत होगी और आप अपनी गतिविधि से डेटा को धक्का या खींच सकते हैं। इस मामले में आपका पर्यवेक्षक आपकी गतिविधि होगी और पर्यवेक्षक आपकी सेवा होगी।

यदि आप डिज़ाइन पैटर्न के बारे में कुछ भी नहीं जानते हैं तो "हेड फर्स्ट डिज़ाइन पैटर्न" खरीदें, यह पढ़ना आसान है और बड़ी जानकारी से भरा है।

पुनश्च: मैं इसे अब पढ़ रहा हूँ।

+8

आप ठीक कह रहे हैं, लेकिन इस सवाल का जवाब अभी तक बेहतर – Janusz

0

आप एक पृष्ठभूमि धागा चल रहा है कि सूची में परिवर्तन की गणना करता होगा। इस धागे को अब जीयूआई को सूचित करने की संभावना है कि सूची अपडेट की गई थी।

आप ListView में डेटा प्राप्त करने के लिए ArrayAdapter किसी तरह का उपयोग कर सकते हैं। जब भी आप इस विधि को कॉल करते हैं तो ArrayAdapter में adpater.notifyDataSetChanged() नामक एक विधि है, एडाप्टर यह देखेगा कि संबंधित डेटा बदल गया है और फिर सूचीदृश्य को सूचित करें कि इसे अगली संभावना पर अपडेट करना चाहिए।

+2

एंड्रॉयड विशिष्ट ... कोई रास्ता नहीं में है, तो आप का उपयोग करने के लिए जा रहे हैं, तो 'ArrayAdapter', बस फोन' जोड़ने() ',' डालने() ', और' हटाने() 'अपनी सामग्री बदलने के लिए' ArrayAdapter' पर विधियां। आपको 'सूचित करेंडेटासेट चेंज() 'की आवश्यकता नहीं है। – CommonsWare

0

आप bindService() का उपयोग करने की दौड़ सेवा के साथ गतिविधि के लिए बाध्य है और इसके साथ संवाद करने के लिए की जरूरत है।

public class BindingActivity extends Activity { 
YourService mService; 
boolean mBound = false; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

@Override 
protected void onStart() { 
    super.onStart(); 
    // Bind to Your Service 
    Intent intent = new Intent(this, YourService.class); 
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
} 

@Override 
protected void onStop() { 
    super.onStop(); 
    // Unbind from the service 
    if (mBound) { 
     unbindService(mConnection); 
     mBound = false; 
    } 
} 

/** Called when a button is clicked (the button in the layout file attaches to 
    * this method with the android:onClick attribute) */ 
public void onButtonClick(View v) { 
    if (mBound) { 
     // Call a method from your Service. 
     // However, if this call were something that might hang, then this request should 
     // occur in a separate thread to avoid slowing down the activity performance. 
     int num = mService.getRandomNumber(); 
     Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show(); 
    } 
} 

/** Defines callbacks for service binding, passed to bindService() */ 
private ServiceConnection mConnection = new ServiceConnection() { 

    @Override 
    public void onServiceConnected(ComponentName className, 
      IBinder service) { 
     // We've bound to the running Service, cast the IBinder and get instance 
     LocalBinder binder = (LocalBinder) service; 
     mService = binder.getService(); 
     mBound = true; 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName arg0) { 
     mBound = false; 
    } 
}; 
} 

और आपकी सेवा की तरह:

public class LocalService extends Service { 
    // Binder given to clients 
    private final IBinder mBinder = new LocalBinder(); 
    // Random number generator 
    private final Random mGenerator = new Random(); 

/** 
* Class used for the client Binder. Because we know this service always 
* runs in the same process as its clients, we don't need to deal with IPC. 
*/ 
public class LocalBinder extends Binder { 
    LocalService getService() { 
     // Return this instance of LocalService so clients can call public methods 
     return LocalService.this; 
    } 
} 

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

/** method for clients */ 
public int getRandomNumber() { 
    return mGenerator.nextInt(100); 
    } 
} 
+0

यह ओपी के लिए काफी कुछ नहीं है। हालांकि यह काम कर सकता है (सेवा लगातार डेटा अपडेट करती है और यूआई नए डेटा के लिए पूछ सकता है), यूआई पक्ष से उपयोगकर्ता इनपुट (जैसे बटन प्रेस) की प्रतिक्रिया के रूप में कॉल की आवश्यकता होती है। इसके विपरीत सवाल यूआई के लिए सेवा में नए डेटा के साथ लगातार अद्यतन करने का एक तरीका मांगता है। –

0

मैं वास्तव में हूँ, वास्तव में सोच क्यों कोई भी जो कुछ भी पुस्तकालय से एक EventBus का उपयोग कर एक सरल दृष्टिकोण का उल्लेख किया। यह निश्चित रूप से है यदि आप आरएक्स का उपयोग नहीं कर रहे हैं। मेरा निजी पसंदीदा EventBus GreenRobot द्वारा है। https://github.com/greenrobot/EventBus

कोड की कुछ पंक्तियों के साथ, और कोई इंटरफेस नहीं। एक घटना को फायर करें, और जहां चाहें वहां सुनें। यह decoupled है, यह धागा सुरक्षित है, और यह आपके ऐप को दुर्घटनाग्रस्त नहीं करेगा।

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