12

Tôi đã viết thư viện bắt đầu một dịch vụ ở chế độ nền. Nó chạy hoàn hảo trong tất cả các ứng dụng.Làm thế nào để chạy một dịch vụ đơn (chia sẻ) trong một thư viện cho nhiều ứng dụng?

Để giảm mức sử dụng RAM, tôi muốn tránh chạy nhiều dịch vụ cho các ứng dụng khác nhau. Trên thực tế, nó là khá đủ để chỉ sử dụng một dịch vụ để hoàn thành công việc.

Thứ nhất, tôi đã viết một tệp AIDL để tạo IPC giữa các ứng dụng/thư viện. Xác định dịch vụ như được xuất/kích hoạt với sự cho phép chữ ký. Vì tất cả các ứng dụng đều chính xác cùng một dịch vụ, nên không thể kiểm tra xem có bất kỳ dịch vụ nào lên hay xuống. Trong khi ràng buộc dịch vụ để kiểm tra điều kiện của dịch vụ, nó luôn tạo và hủy dịch vụ riêng vì bản chất của cờ BIND_AUTO_CREATE. Đó là lý do tại sao không thể nhận bất kỳ loại thông tin nào từ dịch vụ đã xuất nếu nó thực sự hoạt động và chạy.

Sau đó, tôi đã cố gắng xác định Nhà cung cấp nội dung cho tệp kê khai của thư viện. Mục đích của tôi là chia sẻ thông tin dịch vụ thông qua nó. Đó là cơ chế thực sự tốt để giao tiếp giữa dịch vụ xuất khẩu và quy trình chính của ứng dụng. Nhưng nó không thể sử dụng được cho nhiều trường hợp. Bởi vì các ứng dụng nhận được thông tin về nhà cung cấp nội dung từ thư viện sử dụng cùng một quyền và do đó không thể cài đặt thông tin thứ hai. Nó đưa ra lỗi DUPLICATE_PROVIDER_AUTHORITY.

Đề xuất của bạn về vấn đề này là gì? Có tùy chọn nào để tạo cơ chế chính/nô lệ không? Có thể làm cho singleton dịch vụ cho ứng dụng sử dụng dự án thư viện không?

P.S: Đã thử kỹ thuật tùy chọn phát và chia sẻ. Nhưng chúng không hiệu quả khi nghe gọi lại từ dịch vụ đã xuất.

+0

bạn có thể chia sẻ giải pháp mà bạn đã đưa ra không? Ngay cả khi nó không lý tưởng cho những gì bạn muốn .... Bạn nói trong một bình luận 'Tôi đã hoàn thành việc thực hiện của tôi với người nhận phát sóng (sử dụng quyền chữ ký)'. Nó sẽ là thú vị để xem cách bạn xử lý này. – brandall

Trả lời

5

Bạn cần đặt Service trong APK của riêng nó. Nó cần phải có tên gói duy nhất của riêng nó (trong tệp kê khai) khác với tên gói của bất kỳ ứng dụng nào sử dụng nó. Đây là cách bạn làm cho Service hoạt động như một singleton. Bây giờ bạn có thể sử dụng AIDL và liên kết với Service để có giao tiếp hai chiều.

Lưu ý rằng trong nhiều phiên bản gần đây của Android, nó đã trở thành cần thiết để bắt đầu một Service sử dụng một rõ ràngIntent (ví dụ: các Component phải được xác định một cách rõ ràng, bạn có thể không sử dụng chỉ là một ACTION).

+0

Cảm ơn lời giải thích. Nhưng tôi chỉ là tác giả của thư viện chứ không phải ứng dụng. Thư viện của tôi cung cấp một giải pháp duy nhất cho khách hàng. Nó hoạt động tốt trên sản xuất ngay bây giờ. Từ phía tôi, không có cách nào để biết tên ứng dụng, chi tiết, vv Mỗi khách hàng có thể sử dụng nó trong các ứng dụng của họ. Tôi cần một giải pháp ở phía thư viện. – StillHopeForMe

+0

Thực ra, tôi có cơ chế kiểm tra cuộc sống giữa các dịch vụ trong thư viện của mình thông qua hệ thống phát sóng. Nhưng tôi muốn viết mã hiệu quả hơn. – StillHopeForMe

+0

Không có gì bạn có thể làm, sau đó. Bạn sẽ phải sống với nhiều 'Service's, vì không có cách nào mà họ có thể giao tiếp hoặc biết về nhau. Bạn cuối cùng sẽ kết thúc với một điều khoản/cơn ác mộng an ninh anyway. Lấy làm tiếc. –

0

Alternative 1:

  • Nếu trường hợp sử dụng cho phép tôi nghĩ rằng bạn không nên thực hiện dịch vụ. Làm cho khách hàng của bạn triển khai một dịch vụ gọi mã thư viện của bạn. là cách MediaPlayer và các API Android mặc định khác hoạt động.

Phương án 2:

  • Máy chủ dịch vụ trong một riêng biệt app..and tải về ứng dụng khi cuộc gọi đầu tiên được làm từ bất kỳ khách hàng. Từ đây trở đi sẽ có dịch vụ duy nhất xử lý tất cả yêu cầu của khách hàng. Đây là cách một số API như adobe giải pháp không khí/MDM từ công trình Airwatch.

Không có cách nào tốt để bạn có thể kiểm soát thành phần đang chạy trong ứng dụng khác, trừ khi sử dụng bộ thu phát sóng và tất cả.

+0

Tôi đã hoàn tất việc triển khai của mình với bộ thu phát sóng (sử dụng quyền chữ ký). Cảm ơn các giải pháp thay thế của bạn. – StillHopeForMe

+0

@StillHopeForMe bạn có thể xây dựng giải pháp của mình không? –

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