web-dev-qa-db-ja.com

ブロードキャストレシーバーの有効化と無効化

このPackageManagerメソッドを使用して、ブロードキャストレシーバーを有効または無効にしようとしています。

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);

Androidマニフェスト:

    <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");
    }
}

また、昨日アクティビティ内からメソッドを呼び出しました。私はそれがうまくいくと思ったが、今日はもう何も動かない。昨日、受信機を無効にすると誤って解釈したインテント(Android.net.conn.CONNECTIVITY_CHANGE)に大きな遅延が発生することがありますか?

PackageManagerを使用したアプローチは正しい方向ですか、それともアイデアに基本的なエラーがありますか?

どうもありがとう、スヴェン

41
Sven

まあ、あなたが基本的に持っているものはOKのようです。 私のプロジェクトの1つ に次のコードがあります:

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レシーバーを無効にします。

私の推測では、ComponentNameが正しくセットアップされていません(たとえば、先頭の.)。 ContextClassをパラメーターとして使用する、私が使用しているコンストラクターを試してください。

73
CommonsWare

PackageManagerの使用はあなたの状況を考えすぎていると思います。 BroadcastReceiverがあり、それがリッスンしているブロードキャストを時々無視する必要がある場合。これについては、2つの簡単な方法が考えられます。

1)ブロードキャストを無視または受け入れるために受信者がチェックできるフラグを設定し、それを有効化/無効化することをまったく心配しません。

2)BroadcastReceiverをプログラムで作成し(内部クラスでもかまいません)、アプリケーションの特定の部分で必要に応じて登録および登録解除します。

一般に、XMLではなくコードでBroadcastReceiverを定義すると、柔軟性が大幅に向上し、一般的に管理しやすくなることがわかりました。

4
LeffelMania