2011-06-30 34 views
37

tôi biết về việc sử dụng registerReceiver và unregisterReceiver trong mã Java để đối phó với người nhận, nhưng chúng ta hãy nói rằng tôi có điều sau đây trong manifest của tôi:Android - cách hủy đăng ký người nhận được tạo trong tệp kê khai?

<receiver android:name=".headsetHook"> 
     <intent-filter android:priority="99999999999"> 
      <action android:name="android.intent.action.ACTION_HEADSET_PLUG" /> 
     </intent-filter> 
    </receiver> 

Có cách nào tôi có thể ở đâu đó unregister này trong mã Java? Tôi có thể cung cấp cho nó một thuộc tính id hoặc một cái gì đó và sau đó nhận được nó và unregister nó? Tôi hỏi vì tôi muốn ứng dụng của tôi chỉ làm điều gì đó vào lần đầu tiên hành động này xảy ra, sau đó hủy đăng ký và đăng ký lại sau trong Java.

Hy vọng tôi đã làm rõ điều đó, cảm ơn sự giúp đỡ nào.

Trả lời

78

Bạn có thể sử dụng PackageManager để bật/tắt BroadcastReceiver được khai báo trong Tệp kê khai. Các Broadcast Receiver sẽ bị sa thải chỉ khi nó được kích hoạt.

Sử dụng này để tạo ra một phần

ComponentName component = new ComponentName(context, MyReceiver.class); 

Kiểm tra nếu phần được kích hoạt hay vô hiệu hóa

int status = context.getPackageManager().getComponentEnabledSetting(component); 
if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { 
    Log.d("receiver is enabled"); 
} else if(status == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) { 
    Log.d("receiver is disabled"); 
} 

Enable/Disable thành phần (Broadcast Receiver trong trường hợp của bạn)

//Disable 
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED , PackageManager.DONT_KILL_APP); 
//Enable 
context.getPackageManager().setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_ENABLED , PackageManager.DONT_KILL_APP); 
+1

oh chết tiệt bạn là sếp. Hãy để tôi thử điều này, trông đầy hứa hẹn. – JDS

+3

Chỉ cần lưu ý: bạn cũng có thể nhận trạng thái COMPONENT_ENABLED_STATE_DEFAULT –

+0

@Varun +1 Câu trả lời hay .. Làm việc tốt .. – Venky

0

Dựa trên câu trả lời của Varun tôi đã tạo phương pháp tiện dụng này

private void unregisterReceiverFromManifest(Class<? extends BroadcastReceiver> clazz, final Context context) { 
    final ComponentName component = new ComponentName(context, clazz); 
    final int status = context.getPackageManager().getComponentEnabledSetting(component); 
    if(status == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { 
     context.getPackageManager() 
       .setComponentEnabledSetting(component, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
        PackageManager.DONT_KILL_APP); 
     } 
    } 
Các vấn đề liên quan