2010-07-18 27 views
24

Khi tôi có một BroadcastReceiver nói android.intent.action.MEDIA_BUTTON và tôi muốn cập nhật giao diện người dùng của hoạt động hiện tại mà không cần tạo hoạt động mới, có thực hành tốt nào không cái này?Thực tiễn tốt nhất về Android Cập nhật giao diện người dùng từ BroadcastReceiver đến một hoạt động nhất định

gì tôi biết (có thể không chính xác)

1) Tôi có thể đặt BroadcastReceiver trong lớp tương tự như hoạt động và gọi hàm updateUI sau khi hoạt động nhất định

2) Tạo một ContentObserver?

3) Giao tiếp với dịch vụ được tạo bởi hoạt động, sử dụng aidl. (Tôi không biết cách nhận dịch vụ hiện tại nếu đăng ký dịch vụ hiện tại)

4) Tạo bộ lọc tùy chỉnh trên BroadcastReceiver nằm trên cùng một lớp với hoạt động và sử dụng context.sendBroadcast (msg của bộ lọc tùy chỉnh) và trong bộ lọc tùy chỉnh cập nhật cuộc gọiUI (giống như một nhưng chung chung hơn?)

Luồng cuối cùng sẽ đến từ BroadcastReceiver và kết thúc cập nhật giao diện người dùng mà không làm mới hoạt động (trừ khi hoạt động này chết?)

Vui lòng cung cấp liên kết/mã nguồn về cách bạn giải quyết loại sự cố này. Cảm ơn rất nhiều trước :)

Trả lời

36

Cách dễ nhất để cung cấp chức năng này là để đưa thu phát sóng trong bạn Hoạt động và ràng buộc/unbind nó bằng cách sử registerReceiverunregisterreceiver:

public class MyActivity extends Activity { 
    private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      MyActivity.this.receivedBroadcast(intent); 
     } 
    }; 
    @Override 
    public void onResume() { 
     super.onResume(); 
     IntentFilter iff = new IntentFilter(); 
     iff.addAction("android.intent.action.MEDIA_BUTTON"); 
     // Put whatever message you want to receive as the action 
     this.registerReceiver(this.mBroadcastReceiver,iff); 
    } 
    @Override 
    public void onPause() { 
     super.onPause(); 
     this.unregisterReceiver(this.mBroadcastReceiver); 
    } 
    private void receivedBroadcast(Intent i) { 
     // Put your receive handling code here 
    } 
} 

Tùy thuộc vào ý định bạn muốn nhận, bạn có thể cần thêm quyền thích hợp vào tệp AndroidManifest.xml của mình.

+0

Cũng xem xét thông tin được cung cấp tại đây: [BroadcastReceiver.html # onReceive (android.content.Context, android.content.Intent)] (http://developer.android.com/reference/android/content/ BroadcastReceiver.html # onReceive% 28android.content.Context,% 20android.content.Intent% 29) –

0

Điều gần đây tôi phải làm để thay đổi văn bản của Nút sau khi nhận dữ liệu từ LocalBroadcastManager là lưu giá trị vào trường riêng và sau đó thực hiện giao diện người dùng trong phương thức onResume() của tôi.

public class myClass extends Activity { 

    private String myString; 

    @Override 
    public void onCreate(Bundle savedInstanceState) {  
     super.onCreate(savedInstanceState);   
     // register to receive data 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(receiver, new IntentFilter("myAction"));  
    } 

    private BroadcastReceiver receiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      // get the extra data included in the intent 
      myString = intent.getStringExtra("myString"); 
     } 
    }; 

    @Override 
    public void onResume() { 
     super.onResume(); 
     System.out.println("onResume"); 
     // do something to the UI 
     myButton.setText(myString != null ? myString : "Default"); 
    } 
} 
Các vấn đề liên quan