2011-10-25 35 views
16

Tôi có một bộ thu phát sóng được đăng ký theo chương trình trong một hoạt động. Nó phản hồi mục đích PACKAGE_REMOVED, điều này sẽ kích hoạt khi gói bị xóa.Thiết bị phát và hoạt động tạm dừng

Vấn đề là, nó không nhận được thông báo này. Tôi nghĩ rằng điều này là do mục đích đó được kích hoạt khi tôi rời khỏi hoạt động và chuyển sang hoạt động khác để gỡ cài đặt ứng dụng, vì vậy hoạt động ban đầu bị tạm dừng. Có thể là hoạt động bị tạm dừng (nơi người nhận không được đăng ký trong số) cũng tạm dừng người nhận?

Trả lời

36

Khi bạn đăng ký người nhận phát sóng theo chương trình trong một hoạt động, nó sẽ KHÔNG nhận được chương trình phát sóng khi hoạt động bị tạm dừng. BroadcastReceiver docs không rõ ràng như chúng có thể vào thời điểm này. Họ khuyên bạn không nên đăng ký onPause chỉ để giảm chi phí của hệ thống.

Nếu bạn muốn nhận sự kiện ngay cả khi hoạt động của bạn không ở nền trước, hãy đăng ký người nhận trong tệp kê khai của bạn bằng phần tử receiver.

+1

Người nhận đăng ký này có được đăng ký trong tệp kê khai nằm trong hoạt động hiện bị tạm dừng không, có thể truy cập biến riêng tư của hoạt động kèm theo của nó không? – Peterdk

+0

Đừng bận tâm, bây giờ tôi thấy rằng một lớp người nhận không phải là một giao diện, mà là một lớp bạn cần kế thừa. – Peterdk

+0

@chris, tôi không thấy tài liệu này trong tài liệu android. –

2

lẽ bạn có thể đăng ký nhận phục vụ mà sẽ chạy nền

5

Thêm một Receiver để dự án của bạn và bạn sẽ nhận được sự kiện này mà không cần khởi động ứng dụng của bạn.

public class TestReciver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("TestReciver",intent.getAction()+"\n" 
       +intent.getDataString()+"\n" 
       +"UID: "+intent.getIntExtra(Intent.EXTRA_UID,0)+"\n" 
       +"DATA_REMOVED: "+intent.getBooleanExtra(Intent.EXTRA_DATA_REMOVED, false)+"\n" 
       +"REPLACING: "+intent.getBooleanExtra(Intent.EXTRA_REPLACING, false) 
      ); 
    } 

} 

và biểu hiện của bạn thêm nó như thế này (Bên trong ứng dụng của bạn < > tag):

<receiver android:name="TestReciver" > 
    <intent-filter > 
     <action android:name="android.intent.action.PACKAGE_REMOVED" /> 
     <data android:scheme="package" /> 
    </intent-filter> 
</receiver> 

Khi bạn sử dụng một máy thu như thế này bạn không gọi cho bất kỳ đăng ký hoặc unregister nên nó sẽ luôn luôn sẵn sàng nhận dữ liệu.

Lưu ý rằng thao tác này sẽ không hoạt động nếu bạn cho phép người dùng chuyển ứng dụng của bạn sang thẻ SD. Nếu một sự kiện được gửi khi thẻ SD chưa được gắn, người nhận sẽ không thể truy cập được và bạn sẽ bỏ lỡ sự kiện này.

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