2012-01-15 7 views
6

, बस this one के रूप में दूसरों की तरह, दूरस्थ सेवा IMarketBillingService करने के लिए एक स्थानीय सेवा आवरण के माध्यम से, BillingService जोड़ता है।IMarketBillingService के शीर्ष पर एक और सेवा क्यों? गूगल के <a href="http://developer.android.com/guide/market/billing/billing_integrate.html#billing-download" rel="noreferrer">market_billing sample</a>

मैं समझता हूं कि सेवाओं में पृष्ठभूमि में चीजों को करने का लाभ है, लेकिन रिमोट IMarketBillingService रिमोट नहीं है?

इस प्याज में अभी तक एक और परत जोड़ने का क्या फायदा है?

यदि मैं यूआई थ्रेड में सीधे मेरी मुख्य गतिविधि से रिमोट IMarketBillingService से कनेक्ट करने का प्रयास करता हूं तो मैं क्या खो दूंगा?

यदि यूआई थ्रेड में रिमोट IMarketBillingService से सीधे कनेक्ट करने की सलाह नहीं दी जाती है, तो क्या स्थानीय BillingService को मुख्य गतिविधि में बस एक और थ्रेड के साथ प्रतिस्थापित किया जा सकता है?

उत्तर

1

आपकी बिलिंग नहीं होने पर स्थानीय बिलिंग सेवा IMarketBillingService से कॉलबैक को संभालती है।

संदर्भ (http://developer.android.com/reference/android/app/Activity.html) का कहना है:

"एक गतिविधि को रोका या बंद कर दिया, प्रणाली खत्म करने के लिए यह पूछ या तो द्वारा स्मृति से गतिविधि ड्रॉप कर सकते हैं, या बस अपने प्रक्रिया की मौत हो गई जब जाता है। यह उपयोगकर्ता को फिर से प्रदर्शित किया जाता है, यह पूरी तरह से पुनरारंभ होना चाहिए और इसके पिछले राज्य में बहाल होना चाहिए। "

उदाहरण के लिए यदि आप एक RESTORE_TRANSACTIONS बिलिंग अनुरोध का आह्वान करते हैं, तो एंड्रॉइड मार्केट सेवा के प्रतिक्रियाओं में आने के लिए कुछ समय लग सकता है। एक सेवा का उपयोग करके, आप जानते हैं कि गतिविधि लाइफसाइक्ल के बावजूद आप प्रतिक्रियाओं को संभालने के लिए हमेशा आसपास रहेंगे।

बस मस्ती के लिए, मैंने एक छोटा टेस्ट-ऐप लिखने की कोशिश की और सुनिश्चित किया गया। एक चलने वाला धागा रोके गए या बंद गतिविधि पर विधियों को कॉल कर सकता है। जब भी अग्रभूमि में नहीं है तब भी थ्रेड इसके यूआई को भी संशोधित कर सकता है। निम्न एप्लिकेशन चलाएं, ऐप को रोकने के लिए होम स्क्रीन दबाएं। 10 सेकंड के बाद वापस जाएं, और देखें कि टेक्स्ट व्यू बदल गया है ...

package com.example.playground; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class MyActivity extends Activity { 

    private static String TAG = MyActivity.class.getName(); 

    /** 
    * Called when the activity is first created. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Thread t = new Thread(new Runnable() { 
      public void run() { 
       try { 
        Thread.sleep(10000); 
        someMethod(); 
       } catch (InterruptedException e) { 
        Log.e(TAG, e.getMessage(), e); 
       } 
      } 
     }); 
     t.start(); 
    } 

    private void someMethod() { 
     Log.d(TAG, "Some method called"); 
     TextView tv = (TextView) findViewById(R.id.textfield); 
     tv.setText("Called later"); 
    } 
} 
+2

धन्यवाद +1 पहले से ही एक महान उत्तर के लिए है। सेवा की आवश्यकता अच्छी तरह से समझाई गई है और यहां उदाहरण है * लेकिन ... * एक सेवा ('IMarketBillingService') पर्याप्त नहीं है? दो क्यों? स्थानीय * और * दोनों दूरस्थ क्यों? –

+0

यदि आप IMarketBillingService को देखते हैं, तो इसे सार्वजनिक इंटरफ़ेस के रूप में घोषित किया जाता है IMarketBillingService android.os.IInterface को बढ़ाता है। यह एक सेवा नहीं है, केवल एक स्टब जिसे आप रिमोट सर्विस के साथ संवाद करने के लिए उपयोग करते हैं, वास्तव में एंड्रॉइड मार्केट ऐप में चल रहा है अगर मुझे गलत नहीं लगता है। क्लैस के नाम का "सेवा" हिस्सा उलझन में है। –

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