2010-06-05 25 views
13

Tôi có một Dịch vụ Android mà tôi muốn tiếp tục chạy ngay cả sau khi Hoạt động cuối cùng được bật ra khỏi ngăn xếp hoặc Người dùng đã chọn làm điều gì đó khác.Làm thế nào một Dịch vụ Android có thể biết rằng nó không bị ràng buộc với bất kỳ Hoạt động nào

Thực chất Dịch vụ đang lắng nghe những thay đổi trên máy chủ từ xa và tôi muốn tạo Thông báo nếu và chỉ khi Hoạt động từ ứng dụng không chạy (hoặc hiển thị). Nói cách khác, tôi không muốn Thông báo xuất hiện trong khi Người dùng tương tác trực tiếp với ứng dụng.

Trong trường hợp Người dùng trực tiếp tương tác với ứng dụng, Dịch vụ sẽ thông báo cho Hoạt động và cập nhật các phần tử giao diện người dùng thích hợp dựa trên các thay đổi. Tôi dự định thực hiện điều này thông qua mẫu Observer.

Làm thế nào để Dịch vụ biết liệu không có ứng dụng nào Hoạt động bị ràng buộc với nó?

Cảm ơn, J

Trả lời

-2

Làm thế nào Dịch vụ có thể biết nếu không ai trong số ứng dụng hoạt động được liên kết với nó?

Bạn biết nếu không có ràng buộc Activities nếu danh sách Observer của bạn trống.

+4

và cách chúng tôi nên/có thể kiểm tra danh sách Observer? – Ewoks

+0

@Ewoks: Điều đó tùy thuộc vào cách bạn triển khai nó. Bạn sẽ lưu ý rằng OP không giải thích điều này. Ngoài ra, bạn sẽ tìm thấy nút "Đặt câu hỏi" ở góc trên bên phải của trang. Nó thường được coi là hình thức nghèo để bình luận về câu hỏi và câu trả lời cũ như câu hỏi này - thay vào đó hãy hỏi một câu hỏi mới. – CommonsWare

25

Bạn cần phải sử dụng một boolean với onBind, onUnbind và phương pháp onRebind:

public boolean bound; 

@Override 
public Binder onBind(Intent intent){ 
    bound = true; 
    return myBinder; //declare and init your binder elsewhere 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    bound = false; 
    return true; // ensures onRebind is called 
} 

@Override 
public void onRebind(Intent intent) { 
    bound = true; 
} 

onUnbind chỉ gọi khi tất cả khách hàng đã bị ngắt kết nối. Do đó, bị ràng buộc sẽ giữ nguyên đúng cho đến khi tất cả khách hàng đã ngắt kết nối.

** LƯU Ý: Đã chỉnh sửa dựa trên phản hồi từ Gil. **

+0

Điều này là tốt nếu bạn biết rằng bạn sẽ chỉ có một khách hàng bị ràng buộc. Nhưng nếu bạn có hai hoặc nhiều hơn nó sẽ không hoạt động. Thay đổi "ràng buộc" thành một int và theo dõi số lượng khách hàng bị ràng buộc. Nếu không, trong trường hợp của bạn, nếu có hai máy khách được kết nối và khi ngắt kết nối, "bị ràng buộc" sẽ được đặt thành "sai". – psiphi75

+1

@ psiphi75: onUnbind chỉ được gọi khi tất cả các máy khách đã ngắt kết nối, vì vậy bạn không cần phải theo dõi số lượng máy khách bị ràng buộc. – SharkAlley

11

Tôi không thể nhận xét về câu trả lời của SharkAlley vì vậy tôi phát lại ở đây.

Thật không may onBind() là không phải được gọi mỗi khi khách hàng kết nối. Xem ví dụ bà Hackborne của câu trả lời ở đây: https://groups.google.com/d/msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ

Một giải pháp khả thi là để trở về đúng từ onUnbind() và đặt cờ true cả trên onBind()onRebind() (và sai trên onUnbind()).

+1

Tôi đã tạo một dự án thử nghiệm để xác nhận điều này và cập nhật câu trả lời của tôi. Cảm ơn vì bạn đã phản hồi. – SharkAlley

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