【问题标题】:Will Android receivers unregister automatically on application exit?Android 接收器会在应用程序退出时自动注销吗?
【发布时间】:2010-12-14 07:39:51
【问题描述】:

当我的 Android 应用程序需要注册接收器时,我一直在 Activity.onCreate() 中注册并在 Activity.onDestroy() 中取消注册(我想我应该改用 onPause()onResume(),但事实并非如此真的很重要):

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

是否真的需要注销接收器,或者当我的应用程序退出时框架会处理它?

【问题讨论】:

  • 顺便说一句,调用 onDestroy 并不能保证,因为 Android 可能会杀死你的进程。
  • @Yaroslav 我说“我想我应该使用 onPause() 和 onResume() 代替,但这不是重点”

标签: android android-activity receiver


【解决方案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);
    }
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 忽略这一点,当您的应用程序即将退出时,是否真的需要取消注册接收器?
    • 如果你的应用程序没有运行,你想唤醒它吗?如果是这样,您可以在您的清单文件中注册它,仅此而已。否则,在用户退出应用前注销接收者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多