1

当我的 Android 应用程序需要注册接收器时,我一直在注册Activity.onCreate()和取消注册Activity.onDestroy()(我想我应该使用onPause()andonResume()代替,但这并不是重点):

public class Foo extends Activity {
    private Receiver bar = null;

    @Override public void onCreate(Bundle bundle) {
        this.registerReceiver(this.bar = new Receiver(), new IntentFilter());
    }

    @Override public void onDestroy(Bundle bundle) {
        this.unregisterReceiver(this.bar);
    }
}

取消注册接收器实际上是必要的,还是当我的应用程序退出时框架会处理它?

4

2 回答 2

1

例如,如果使用 Android 生命周期感知组件,您可以在 onCreate 中处理接收器并在退出时自动取消注册接收器

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getLifecycle().addObserver(new ReceiverLifecycleObserver(this, new IntentFilter(Intent.ACTION_BATTERY_CHANGED), new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d(TAG, "onReceive: intent=" + intent);
        }
    }));
}

static class ReceiverLifecycleObserver implements LifecycleObserver {
    private final Context context;
    private final IntentFilter filter;
    private final BroadcastReceiver receiver;

    public ReceiverLifecycleObserver(Context context, IntentFilter filter, BroadcastReceiver receiver) {
        this.context = context;
        this.filter = filter;
        this.receiver = receiver;
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart(LifecycleOwner owner) {
        context.registerReceiver(receiver, filter);
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop(LifecycleOwner owner) {
        context.unregisterReceiver(receiver);
    }
}
于 2020-12-14T11:34:58.190 回答
0

如果在 Activity.onResume() 实现中注册接收器,则应在 Activity.onPause() 中取消注册。(暂停时您不会收到意图,这将减少不必要的系统开销)

于 2010-12-14T10:00:59.720 回答