web-dev-qa-db-ja.com

アプリケーションクラスでのBroadcastReceiverの登録と登録解除

Android ApplcationクラスのonCreate()メソッドに登録されているブロードキャストレシーバーがありますが、登録を解除する方法

public class MyApplication extends Application {


@Override
public void onCreate() {
    super.onCreate();
    registerReceiver(broadcastReceiver, new IntentFilter("TIMEZONE_CHANGED"));
}

上記のコードでは、アプリケーションのonCreate()メソッドに登録しており、broadcastReceiverの登録を解除するApplicationクラスにonDestroy()/ onStop()メソッドはありません。

それを達成する方法

18
Anbu

アプリの実行中ずっとリッスンする場合は、登録を解除する必要はありません。ドキュメントから(今日現在):

コンテキスト登録された受信機は、登録コンテキストが有効である限り、ブロードキャストを受信します。たとえば、アクティビティコンテキスト内で登録すると、アクティビティが破棄されない限り、ブロードキャストを受信します。アプリケーションコンテキストに登録すると、アプリが実行されている限り、ブロードキャストを受信します。

https://developer.Android.com/guide/components/broadcasts.html

38
Brian Yencho

baseActivityを作成する必要があります。

public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    registerReceiver(broadcastReceiver, new IntentFilter("TIMEZONE_CHANGED"));
}

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(broadcastReceiver);
}
}

MainActivityはBaseActivityを拡張します

例:

public class MainActivity extends BaseActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}
}

Applicationクラス内でunregisterレシーバーを呼び出すことができます。このように呼び出すだけです。

onDesctroy()メソッド呼び出し内のMainActivity内

@Override
protected void onDestroy() {
    super.onDestroy();
    ((MyApplication) getApplication()).unregisterReceiver();
}

myApplicationクラスにnregisterReceiver()メソッドを作成します

 public class MyApplication extends Application {


    @Override
    public void onCreate() {
        super.onCreate();
        registerReceiver(broadcastReceiver, new IntentFilter("TIMEZONE_CHANGED"));
    }

public void unregisterReceiver() {
     unregisterReceiver(broadcastReceiver);
}
1
Mohit Suthar