Activity com.example.mytaskmanager.MyActionBar has leaked IntentReceiver

Activity com.example.mytaskmanager.MyActionBar has leaked IntentReceiver

05-17 19:07:22.804: E/ActivityThread(20104): Activity com.example.mytaskmanager.MyActionBar has leaked IntentReceiver com.example.mytaskmanager.Battery$1@417d1238 that was originally registered here. Are you missing a call to unregisterReceiver()?
05-17 19:07:22.804: E/ActivityThread(20104): android.app.IntentReceiverLeaked: Activity com.example.mytaskmanager.MyActionBar has leaked IntentReceiver com.example.mytaskmanager.Battery$1@417d1238 that was originally registered here. Are you missing a call to unregisterReceiver()?
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:781)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:567)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1067)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1054)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.ContextImpl.registerReceiver(ContextImpl.java:1048)
05-17 19:07:22.804: E/ActivityThread(20104): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:341)
05-17 19:07:22.804: E/ActivityThread(20104): at com.example.mytaskmanager.Battery.onCreate(Battery.java:114)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:801)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1038)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.BackStackRecord.run(BackStackRecord.java:622)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1396)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
05-17 19:07:22.804: E/ActivityThread(20104): at android.os.Handler.handleCallback(Handler.java:605)
05-17 19:07:22.804: E/ActivityThread(20104): at android.os.Handler.dispatchMessage(Handler.java:92)
05-17 19:07:22.804: E/ActivityThread(20104): at android.os.Looper.loop(Looper.java:154)
05-17 19:07:22.804: E/ActivityThread(20104): at android.app.ActivityThread.main(ActivityThread.java:4624)
05-17 19:07:22.804: E/ActivityThread(20104): at java.lang.reflect.Method.invokeNative(Native Method)
05-17 19:07:22.804: E/ActivityThread(20104): at java.lang.reflect.Method.invoke(Method.java:511)
05-17 19:07:22.804: E/ActivityThread(20104): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
05-17 19:07:22.804: E/ActivityThread(20104): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
05-17 19:07:22.804: E/ActivityThread(20104): at dalvik.system.NativeStart.main(Native Method)


My app has action bar with 3 fragment tabs.
In the second fragment I have these errors and as I understand I have to unregister Reciever but I'm not sure where in the code to do that

view plaincopy to clipboardprint?
Note: Text content in the code blocks is automatically word-wrapped
    
public class Battery extends Fragment {  
    private TextView batteryInfo, procent;  
    int  health = 0, level=0, plugged=0, scale=0, status=0, temperature=0, voltage=0;  
    String  technology = "";  
    boolean present = false;  
    ProgressBar pb;  
      
     
      
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,  
            Bundle savedInstanceState) {  
          
        View myFragmentView = inflater.inflate(R.layout.layout, container, false);  
        procent=(TextView)myFragmentView.findViewById(R.id.BatteryProc);  
        batteryInfo=(TextView)myFragmentView.findViewById(R.id.textViewBatteryInfo);  
        pb = (ProgressBar)myFragmentView.findViewById(R.id.progressbar);  
        memoryInfo = (TextView)myFragmentView.findViewById(R.id.memory);  
        return myFragmentView;  
    }  
 
    @Override 
    public void onResume() {  
        super.onResume();  
        setare();  
      
    }  
      
      
    public void setare(){  
          
        procent.setText("Level: " + level + "%");  
        pb.setProgress(level);  
        batteryInfo.setText(  
                "Health: "+health+"\n"+  
                "Plugged: "+plugged+"\n"+  
                "Present: "+present+"\n"+  
                "Scale: "+scale+"\n"+  
                "Status: "+status+"\n"+  
                "Technology: "+technology+"\n"+  
                "Temperature: "+temperature+"\n"+  
                "Voltage: "+voltage+"\n");  
          
    }  
 
    @Override 
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
          
        getActivity().registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));  
    }  
       
    private BroadcastReceiver batteryInfoReceiver = new BroadcastReceiver() {  
        @Override 
        public void onReceive(Context context, Intent intent) {  
               
            health= intent.getIntExtra(BatteryManager.EXTRA_HEALTH,0);  
            level= intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);  
            plugged= intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,0);  
            present= intent.getExtras().getBoolean(BatteryManager.EXTRA_PRESENT);  
            scale= intent.getIntExtra(BatteryManager.EXTRA_SCALE,0);  
            status= intent.getIntExtra(BatteryManager.EXTRA_STATUS,0);  
            technology= intent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY);  
            temperature= intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE,0);  
            voltage= intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,0);  
              
            setare();          
    
        }  
    };  
       
    

 
public class Battery extends Fragment {
    private TextView batteryInfo, procent;
    int  health = 0, level=0, plugged=0, scale=0, status=0, temperature=0, voltage=0;
    String  technology = "";
    boolean present = false;
    ProgressBar pb;
   
  
   
    @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
   Bundle savedInstanceState) {
  
     View myFragmentView = inflater.inflate(R.layout.layout, container, false);
  procent=(TextView)myFragmentView.findViewById(R.id.BatteryProc);
        batteryInfo=(TextView)myFragmentView.findViewById(R.id.textViewBatteryInfo);
        pb = (ProgressBar)myFragmentView.findViewById(R.id.progressbar);
        memoryInfo = (TextView)myFragmentView.findViewById(R.id.memory);
  return myFragmentView;
 }

    @Override
 public void onResume() {
  super.onResume();
        setare();
   
    }
   
   
    public void setare(){
       
     procent.setText("Level: " + level + "%");
     pb.setProgress(level);
     batteryInfo.setText(
                "Health: "+health+"\n"+
                "Plugged: "+plugged+"\n"+
                "Present: "+present+"\n"+
                "Scale: "+scale+"\n"+
                "Status: "+status+"\n"+
                "Technology: "+technology+"\n"+
                "Temperature: "+temperature+"\n"+
                "Voltage: "+voltage+"\n");
       
    }

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        getActivity().registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
   }
    
    private BroadcastReceiver batteryInfoReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            
            health= intent.getIntExtra(BatteryManager.EXTRA_HEALTH,0);
            level= intent.getIntExtra(BatteryManager.EXTRA_LEVEL,0);
            plugged= intent.getIntExtra(BatteryManager.EXTRA_PLUGGED,0);
            present= intent.getExtras().getBoolean(BatteryManager.EXTRA_PRESENT);
            scale= intent.getIntExtra(BatteryManager.EXTRA_SCALE,0);
            status= intent.getIntExtra(BatteryManager.EXTRA_STATUS,0);
            technology= intent.getExtras().getString(BatteryManager.EXTRA_TECHNOLOGY);
            temperature= intent.getIntExtra(BatteryManager.EXTRA_TEMPERATURE,0);
            voltage= intent.getIntExtra(BatteryManager.EXTRA_VOLTAGE,0);
           
            setare();       
 
        }
    };
    
 
}
 

I tried this but now I have receiver not registered errors, should I move the register code to onCreateView() and leave the unregister like this ?
(Is onDestroyView() still called when I select the Battery tab and then click the home button? because if not I suppose the errors wouldn't be solved )

view plaincopy to clipboardprint?
Note: Text content in the code blocks is automatically word-wrapped
public void onDestroyView() {  
        getActivity().unregisterReceiver(batteryInfoReceiver);  
        super.onDestroyView();  
    } 

you should add the code for unregistering the broadcast receiver in the OnDestroy method of the activity.

Override the onDestroy method and place the unregisterReceiver(batteryInfoReceiver); in it and there you go...!!!

Copyright © 2007-2012 www.chuibin.com Chuibin Copyright