Search code examples
androideclipseandroid-fragmentsbroadcastreceiver

OnDestroy exception in Main Activity using Android fragment


I am having a "Receiver no registered exception" in OnDestroy method of my app using fragments.

I have a MainActiviy class where I check if the user registered an account. If not account created, I load the register account class fragment to allow the user create an account. After the user create the account clicking a button I restart the MainActivity class.

I need to register a broadcastreceiver only after the user create an account.

But, after the restart the MainActivity class from Frgamnent Class, I am getting an exception of receiver not registered in event OnDestroy of Main Activity.

Any help to solve it will be appreciated.

Thanks in Advance, Luiz

My MainActivity Class

public class MainActivity extends Activity {

    // if run on phone, isSinglePane = true
    // if run on tablet, isSinglePane = false
    static boolean isSinglePane;
    private GcmUtil gcmUtil;

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

        View v = findViewById(R.id.phone_container);
            if (!AccountRegisterCreated()){
                //this fragmment register an account to user, and save in Preferences 
                RegisterFragment myListFragment= new RegisterFragment();
                FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
                fragmentTransaction.add(R.id.phone_container, myListFragment);
                fragmentTransaction.commit();
                return;
            }
            registerReceiver(registrationStatusReceiver, new IntentFilter(Common.ACTION_REGISTER));
      }

      private BroadcastReceiver registrationStatusReceiver = new  BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null && Common.ACTION_REGISTER.equals(intent.getAction())) {
                switch (intent.getIntExtra(Common.EXTRA_STATUS, 100)) {
                    case Common.STATUS_SUCCESS:
                        getActionBar().setSubtitle("online");
                        break;
                    case Common.STATUS_FAILED:
                        getActionBar().setSubtitle("offline");
                        break;
                }
            }
        }
    };

@Override
protected void onPause() {
    ContentValues values = new ContentValues(1);
    super.onPause();
}

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

private boolean AccountRegisterCreated(){
    SharedPreferences prefs;
    prefs= PreferenceManager.getDefaultSharedPreferences(this);
    String fullname = prefs.getString(DataProvider.COL_EMAIL,"");
    if (!fullname.isEmpty()) {
        return true;
    }
    return false;
}

}

My Fragment Class:

public class RegisterFragment extends Fragment {
    private static SharedPreferences prefs;
    static final String TAG = "pushabout";
    TextView name;
    TextView email;
    TextView password;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.register, null);
        name = (TextView) view.findViewById(R.id.reg_fullname);
        email = (TextView) view.findViewById(R.id.reg_email);
        password = (TextView) view.findViewById(R.id.reg_password);

        if (email.getText().toString().isEmpty()){
            email.setText(Common.getPreferredEmail());
        }
        Button mButton = (Button) view.findViewById(R.id.btnRegister);
        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //checa email e reg e salva pref e registra gcm
                prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
                SharedPreferences.Editor editor = prefs.edit();
                editor.putString(DataProvider.COL_NAME, sname);
                editor.putString(DataProvider.COL_EMAIL, semail);
                editor.putString(DataProvider.COL_PWD, spassword);
                editor.commit();
                Intent intent = new Intent(getActivity(), MainActivity.class);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intent);
            }
        });
        return view;
    }
}

Solution

  • The problem is not with the Fragment. It's the BroadcastReceiver in your Activity.

    Try declaring your BroadcastReceiver as a class field:

    public class MainActivity extends Activity {
        ...
        BroadcastReceiver mBroadcastReceiver;
        ...
    

    Then, you should change how you're creating and registering the receiver. The way I've done it is by registering during the activity's onResume instead of onCreate(). If you do this, you'll also need to unregister during onPause() instead of onDestroy(). It will look something like this:

    @Override
    public void onResume() {
        super.onResume();
    
        // Create and register your receiver here.
    
        if (AccountRegisterCreated) {
            mBroadcastReceiver = new  BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    ....
                }
            }
            registerReceiver(mBroadcastReceiver, new IntentFilter(Common.ACTION_REGISTER));
        }
    
        ...
    }
    
    @Override
    public void onPause() {
        super.onPause();
    
        // Unregister your receiver here
    
        if (mBroadcastReceiver != null) {
            unregisterReceiver(mBroadcastReceiver);
        }
    }