2013-02-25 29 views
0

我认为必须registerReceiverACTION_TIME_TICK行动,但我不知道我应该取消注册。我应该在哪里注销我的视图中的注册接收者?

如果我不这样做,我会有泄漏。

下面是一些相关的代码:

public class TimeIndicator extends ViewSwitcher { 

    private void build(final Context context) { 

     this.addView(View.inflate(context, R.layout.time_indicator, null)); 

     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_TIME_TICK); 
     context.registerReceiver(this.receiver, filter); 
    } 

    public final BroadcastReceiver receiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.i("onReceive", intent.getAction()); 
     } 
    }; 
} 

我应该在哪里,我自己的看法unregisterReceiver?

+0

要注册的onResume,并在注销的onPause它。 – PPD 2013-02-25 08:52:19

回答

0

这不是一个好的行为,您的视图并不代表上下文(没有明确的生命周期,也没有生命周期的回调方法-onPause,onCreate ....-)

因此,你应该做的是在你的视图所属的第一个父上下文对象处将接收器加以推理。如果它是一个活动的片段。

然后,您可以在父母的onCreate()处注册接收者。 并删除它时,你不想接收更新了或onStop()

+0

我会说不要onCreate()方法,而应该使用onStart()方法。 – Prizoff 2017-04-18 22:48:51

3
@Override 
protected void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 
    //add your code. 
    getContext().unregisterReceiver(mReceiver); 
}; 
+0

不起作用。引发一些例外 – 2017-04-10 06:41:48

相关问题