2011-04-11 3 views
40

을 활성화하고 비활성화 :내가 사용하고이 패키지 매니저 방법을 사용하여 방송 수신기를 해제하려고 브로드 캐스트 수신기

setComponentEnabledSetting(componentName, 
     PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
     PackageManager.DONT_KILL_APP); 

방송 수신기는 매니페스트에 등록됩니다. 수신기 잘 작동하지만 내가 그것을 해제하려고 할 때 여전히 브로드 캐스트 메시지를받습니다. 매니페스트의 수신기를 "android : enabled ="false ""로 비활성화하면 수신자가 아무 것도 수신하지 못하고 수신자를 활성화 할 수 없습니다.

서비스 내부에서 메서드를 호출합니다.

PackageManager pm = getApplicationContext().getPackageManager(); 
    ComponentName componentName = new ComponentName("com.app", 
      ".broadcast_receivers.OnNetworkChangedReceiver"); 
    pm.setComponentEnabledSetting(componentName, 
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
      PackageManager.DONT_KILL_APP); 

안드로이드 매니페스트 :

<receiver android:name=".broadcast_receivers.OnNetworkChangedReceiver" 
       android:enabled="true"> 
      <intent-filter> 
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
      </intent-filter> 
    </receiver> 

수신자

public class OnNetworkChangedReceiver extends BroadcastReceiver { 
private static final String TAG = "OnNetworkChangedReceiver"; 

@Override 
public void onReceive(Context context, Intent intent) { 
    Log.d(TAG, "in OnNetworkChanged"); 
    } 
} 

은 또한 어제 액티비티 내부에서 방법을했다. 나는 그것이 효과가 있다고 생각했지만 오늘은 더 이상 아무것도 작동하지 않습니다. 내가 어제 오해하여 수신기를 사용하지 못하게 한 의도 (orroid.net.conn.CONNECTIVITY_CHANGE)에 큰 지연이있을 수 있습니까?

PackageManager의 접근 방식이 올바른 방향입니까? 아니면 아이디어에 기본적인 오류가 있습니까? 귀하의 상황을 생각하고 오버

덕분에 많이, 스벤

+0

@Sven으로, 귀하의 초기 실수는 매우 일반적인 것이 었습니다. 필요한 ComponentName ("com.app", "com.app.broadcast_receivers.OnNetworkChangedReceiver"); 패키지 이름이 두 번 나열되기 때문에이 솔루션이 이상하게 보입니다. 그리고 'New Android Wizard'이후 ...'는 단지 프로젝트를 처음 생성 할 때 오직 하나의 패키지 이름만을 요구할 수 있습니다. 단 하나만 있다고 생각하기 쉽지만 실제로는 그 문자열을 사용하여 두 개의 다른 패키지 이름에 할당합니다. 이름 및 활동 패키지 이름. –

+0

'PackageManager.DONT_KILL_APP' 대신'0'을 사용하면 올바르게 문서를 읽는다면 활동을 없앨 수 있습니다. http://developer.android.com/reference/android/content/pm/PackageManager . Set SetComponentEnabledSetting 섹션에 .html. –

답변

71

글쎄, 기본적으로 좋아 보이는 것 같습니다. 내가 예약 할 필요가 활성 경보가 없을 때

boolean enabled=prefs.getBoolean(key, false); 
int flag=(enabled ? 
      PackageManager.COMPONENT_ENABLED_STATE_ENABLED : 
      PackageManager.COMPONENT_ENABLED_STATE_DISABLED); 
ComponentName component=new ComponentName(EditPreferences.this, OnBootReceiver.class); 

getPackageManager() 
    .setComponentEnabledSetting(component, flag, 
           PackageManager.DONT_KILL_APP); 

가 나는 BOOT_COMPLETED 수신기을 사용하지 않도록 : 나는 one of my projects에 다음과 같은 코드가 있습니다.

내 생각에 ComponentName이 올바르게 설정되어 있지 않습니다 (예 : 귀하의 수석 .). 사용중인 생성자를 시도해보십시오. 매개 변수로 ContextClass이 필요합니다.

+1

빠른 답변을 제공해 주셔서 감사합니다. 내가 사용한 생성자를 사용했고 이제는 작동합니다. – Sven

+0

부트 리시버가 있다고 가정 해보십시오. 'onReceive'가 반환되기 전에 비활성화 할 가치가 있습니까? 다음 재부팅시 실행됩니까? –

+1

@Mr_and_Mrs_D : 장치가 재부팅 될 때 비활성화되어 있으면 호출되지 않습니다. – CommonsWare

4

나는 패키지 매니저를 사용하여 생각이다. 듣고있는 브로드 캐스트를 무시해야하는 BroadcastReceiver가 있습니다. 나는 이것에 대해 갈 수있는 두 가지 쉬운 방법을 생각할 수 있습니다 :

1) 수신자가 브로드 캐스트를 무시하거나 수락 할 수있는 플래그를 설정하고 전혀 사용/사용 안 함으로 걱정하지 마십시오.

2) BroadcastReceiver를 프로그래밍 방식으로 생성 (내부 클래스 일 수도 있음)하고 응용 프로그램의 특정 부분에서 필요에 따라 등록 및 등록을 취소합니다.

일반적으로 XML 대신 코드에서 내 BroadcastReceivers를 정의하면 유연성이 향상되고 일반적으로 관리하기가 쉽다는 것을 발견했습니다.

+9

'registerReceiver()'를 통해 효과적으로 등록 할 수없는 브로드 캐스트 유형 (예 :'BOOT_COMPLETED')이 있습니다. 또한'registerReceiver()'에 지나치게 의존하게되면 수신자를 유지하기 위해 서비스를 제공하는 영원한 서비스로 이어집니다. 특히 BOOT_COMPLETED와 같이 널리 사용되는 시스템 브로드 캐스트를 사용하면 구성 요소를 사용하지 않도록 설정하는 것이 좋습니다. – CommonsWare

+1

아주 좋은 지적입니다. Programmatically BroadcastReceivers는 영원한 서비스를 피하기 위해 책임감있는 등록/등록 취소가 필요합니다. 언제나 그렇듯이 그것은 상황에 달려 있습니다. – LeffelMania

관련 문제