2012-01-15 21 views
6

của Google market_billing sample, giống như những người khác như this one, kết nối với các dịch vụ từ xa IMarketBillingService thông qua một dịch vụ wrapper địa phương, BillingService.Tại sao một dịch vụ khác trên IMarketBillingService?

Tôi hiểu rằng các dịch vụ có lợi thế khi thực hiện công việc ở chế độ nền, nhưng không đủ điều kiện từ xa IMarketBillingService?

Lợi thế của việc thêm một lớp khác cho hành tây này là gì?

Tôi sẽ mất gì nếu cố gắng kết nối với điều khiển từ xa IMarketBillingService trực tiếp từ hoạt động chính của tôi, trong chuỗi giao diện người dùng?

Nếu không nên kết nối trực tiếp với từ xa IMarketBillingService trực tiếp trong chuỗi giao diện người dùng, có thể thay thế BillingService cục bộ bằng chỉ một chuỗi khác trong hoạt động chính không?

Trả lời

1

Thanh toán cục bộ xử lý cuộc gọi lại từ IMarketBillingService khi hoạt động của bạn không hoạt động.

Các tài liệu tham khảo (http://developer.android.com/reference/android/app/Activity.html) nói:

"Nếu một hoạt động bị tạm dừng hoặc dừng lại, hệ thống có thể thả các hoạt động từ bộ nhớ bằng cách hoặc là yêu cầu nó để kết thúc, hoặc đơn giản là giết chết quá trình của nó Khi. nó được hiển thị lại cho người dùng, nó phải hoàn toàn được khởi động lại và khôi phục về trạng thái trước đó của nó. "

Nếu ví dụ bạn gọi yêu cầu thanh toán RESTORE_TRANSACTIONS, phản hồi từ Dịch vụ thị trường Android có thể mất một chút thời gian để đến. Bằng cách sử dụng một dịch vụ, bạn biết rằng bạn sẽ luôn ở xung quanh để xử lý các phản hồi, bất kể Vòng đời hoạt động.

Chỉ để cho vui, tôi đã cố gắng viết một ứng dụng thử nghiệm nhỏ và đã bị ngoại lệ. Một luồng đang chạy có thể gọi các phương thức trên một hoạt động bị tạm dừng hoặc dừng lại. Chủ đề cũng có thể sửa đổi giao diện người dùng ngay cả khi hoạt động không ở nền trước. Chạy ứng dụng sau, nhấn vào màn hình chính để dừng ứng dụng. Quay lại sau 10 giây và thấy rằng TextView đã thay đổi ...

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

Cảm ơn +1 đã có câu trả lời tuyệt vời. Sự cần thiết cho một dịch vụ được giải thích rõ ràng và được minh họa tại đây * nhưng ... * không phải là một dịch vụ ('IMarketBillingService') có đủ không? Tại sao hai? Tại sao cả local * và * remote? –

+0

Nếu bạn nhìn vào IMarketBillingService, nó được khai báo là giao diện công cộng IMarketBillingService mở rộng android.os.IInterface. Đây không phải là một dịch vụ, chỉ là một nhánh mà bạn sử dụng để giao tiếp với Dịch vụ từ xa, thực sự đang chạy trong Ứng dụng Android Market nếu tôi không nhầm lẫn. "Dịch vụ" một phần của tên của Classe là khó hiểu. –

Các vấn đề liên quan