2012-04-03 56 views
7

Tôi có một dịch vụ với một constructor sau:Làm thế nào để khởi tạo dịch vụ Android với một nhà xây dựng?

public ShimmerService(Context context, Handler handler) { 
    mHandler = handler; 
} 

Tôi muốn nhanh chóng lớp dịch vụ này. Tôi đã sau mã nhưng, tôi không chắc chắn nơi để vượt qua paramater:

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder binder) { 
     mShimmerService = ((ShimmerService.ShimmerConfigureBinder) binder) 
       .getService(); 
     Toast.makeText(ConfigureShimmer.this, 
       "Shimmer service has succesfully started.", 
       Toast.LENGTH_SHORT).show(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     mShimmerService = null; 
    } 
}; 

Tôi có mọi thứ khác thiết lập bao gồm ràng buộc, trên đầu và vân vân. Nhưng tôi gặp lỗi ở mã trên:

04-03 19:06:10.285: E/AndroidRuntime(16837): java.lang.RuntimeException: Unable to instantiate service com.milanix.androidecg.services.ShimmerService: java.lang.InstantiationException: can't instantiate class com.milanix.androidecg.services.ShimmerService; no empty constructor 

Làm cách nào để khắc phục sự cố này? Tôi sẽ cần phải vượt qua thông số ở đâu? Sau công trình mã nhưng, nó thay vì sử dụng lớp dịch vụ như là một lớp, chứ không phải là dịch vụ:

mShimmerService = new ShimmerService(this, mHandler); 

Trả lời

11

Bạn không nên xây dựng các dịch vụ (hoặc các hoạt động hoặc thiết bị thu phát sóng) một cách rõ ràng. Hệ thống Android thực hiện điều đó trong nội bộ. Cách thích hợp để xây dựng một dịch vụ là thông qua startService() với mục đích; cảm thấy tự do để thêm các thông số bổ sung cho mục đích đó.

+0

nhưng, tôi sẽ chuyển trình xử lý bằng cách sử dụng và ý định như thế nào? bất kỳ ví dụ nào? – Milan

+1

Bạn cần trình xử lý đó để làm gì? Bạn có chắc chắn việc xây dựng trình xử lý từ đầu trong dịch vụ sẽ không giúp ích gì không? Dịch vụ không phải là chủ đề; dịch vụ thực hiện trên cùng một chuỗi giao diện người dùng như mã người tiêu dùng. –

+0

Tôi không biết liệu có sự khác biệt giữa 'bindService' và' startService' trong vấn đề này hay không, nhưng theo tài liệu và [thảo luận này] (https://groups.google.com/d/topic/android-developers/onqqpHz2WQw/discussion) extras _might_ không có ở đó khi Intent được nhận trong 'onBind'. – DuneCat

1

Dịch vụ mở rộng Ngữ cảnh, vì vậy bạn không thực sự cần nó như một tham số trong hàm tạo của bạn, vì bạn có thể sử dụng cùng một cá thể đó.

Nếu bạn có bất kỳ thông số nào khác mà bạn muốn chuyển vào dịch vụ, tôi khuyên bạn nên thêm chúng vào mục đích startService làm phần bổ sung và nhận chúng trong phương thức service.onStartCommand.

+0

một lần nữa, làm thế nào là nó có thể vượt qua xử lý bằng cách sử dụng ý định? – Milan

0

Không chuyển trình xử lý cho Dịch vụ, Trình xử lý không thực hiện được Bưu kiện hoặc Nối tiếp, vì vậy tôi không nghĩ điều đó có thể xảy ra.

Tạo Trình xử lý trong Dịch vụ và chuyển bất kỳ dữ liệu nào bạn cần để tạo Trình xử lý thông qua các tính năng bổ sung Intent cho Dịch vụ.

0

Bạn cần phải có một hàm tạo không có đối số cho lớp Service của bạn, nếu không hệ thống không biết cách khởi tạo nó.

0

Thay vì truyền Handler (hoặc bất kỳ đối tượng nào) cho dịch vụ (không thể thực hiện được), bạn tạo và đăng ký BroadcastReceiver trong lớp Hoạt động của bạn. Khi bạn cần gọi các hàm Handler (hoặc bất kỳ hàm nào trong một đối tượng khác) thì gửi phát sóng trên máy thu đã đăng ký (sendBroadcast). Bạn cũng có thể đặt thêm các tham số bổ sung cho mục đích và bạn có thể xử lý tất cả các mã cần thiết trực tiếp từ Hoạt động theo các tham số.

Có thể, trong trường hợp này, trình xử lý của bạn sẽ bị xóa hoàn toàn (Phụ thuộc vào những gì bạn thực sự cần.). Với người nhận phát sóng, tôi không biết tưởng tượng tình huống khi bạn cần chuyển một số đối tượng cho Dịch vụ. Mặt khác, bạn làm điều gì đó không tốt và bạn nên xem lại thiết kế của ứng dụng.

Nếu chúng tôi muốn một thứ gì đó được chuyển đến Dịch vụ, chúng tôi chỉ có thể bắt đầu Dịch vụ với các thông số bổ sung trong Mục đích. Dịch vụ xử lý trạng thái theo các tham số này bên trong.

Ý tưởng là Dịch vụ có thể chạy độc lập với các phần khác của ứng dụng, ví dụ: Hoạt động. Chúng tôi có thể kiểm soát nó với các thông số bổ sung khi chúng tôi bắt đầu Dịch vụ hoặc gửi các chương trình phát sóng để gọi mã bên ngoài.

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