1

I'm trying to call an activity using

startActivityForResult()

from a fragment. That activity basically does something and then gives the result back, but what happens, which is really weird is that, after the called activity finishes, the fragment calls onStart, then onResume, then onActivityResult, then onResume again, and I can't understand why. This is causing so much trouble.

Here is the code:


Class extends ListFragment {
...
@Override
    public void onResume() {

        Log.i(TAG_LOG, "onResume");

        SharedPreferences pref = getActivity().getSharedPreferences(PreferenceKeys.PREF_NAME, MODE_PRIVATE);
        SharedPreferences.Editor editor = pref.edit();

        long timePassed;

        // goes here if the trial time has expired
        if ((pref.getBoolean(PreferenceKeys.TRIAL_DONE, false) && pref.getString(PreferenceKeys.USERNAME, "").equals("")) ||
                (!pref.getBoolean(PreferenceKeys.TRIAL, false) && pref.getString(PreferenceKeys.USERNAME, "").equals(""))) {

            Log.i(TAG_LOG, "onResume-first if");

            if (pref.getBoolean(PreferenceKeys.ON_RESUME_CALL, true)) {

                Log.i(TAG_LOG, "onResume-first if-onResumeCall");
                editor.putBoolean(PreferenceKeys.ON_RESUME_CALL, false);

                Intent intent = new Intent(getActivity(), LoginRegisterActivity.class);
                if (!pref.getBoolean(PreferenceKeys.TRIAL_DONE, false)) {
                    intent.putExtra("showTrialButton", true);
                }
                startActivityForResult(intent, REQUEST_LOGIN_REGISTER);
            }
        } else if (!pref.getBoolean(PreferenceKeys.TRIAL_DONE, false) &&
                mResponseReceiver == null &&
                (timePassed  = pref.getLong(PreferenceKeys.TRIAL_STARTING_TIME, 0)) != 0) {


            Log.i(TAG_LOG, "sono dentroooooo");

            //this happens when the application has been force stopped,
            //since the receiver would never be notified and the trial would never end
             if ((System.currentTimeMillis() - timePassed) >= (30 * 60 * 1000)) {


                if (onUserActionListener != null) {
                    onUserActionListener.onTrialEnded();
                }

            } else {

                 if (onUserActionListener != null) {
                     onUserActionListener.onTrialStarted();
                 }
             }
        }
super.onResume();
}
...
@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {

        Log.i(TAG_LOG, "onActivityResult");

        if (requestCode == REQUEST_LOGIN_REGISTER) {
            if(resultCode == Activity.RESULT_OK){

                String username;
                String password;

                SharedPreferences preferences = getActivity().getSharedPreferences(PreferenceKeys.PREF_NAME, MODE_PRIVATE);
                SharedPreferences.Editor editor = preferences.edit();

                if ((!data.hasExtra(PreferenceKeys.USERNAME))) {
                    if(data.getBooleanExtra(PreferenceKeys.TRIAL, false) &&
                            !preferences.getBoolean(PreferenceKeys.TRIAL, false)) {

                        editor.putBoolean(PreferenceKeys.ON_RESUME_CALL, true).apply();

                        // this is used to show the log in button while mode is trial
                        onUserActionListener.onTrialStarted();

                    }
                } else {

                    // TODO: manage the connection with the server

                    username = data.getStringExtra(PreferenceKeys.USERNAME);
                    password = data.getStringExtra(PreferenceKeys.PASSWORD);


                    onUserActionListener.onUserConnected(username, password);

                }
            }
            if (resultCode == Activity.RESULT_CANCELED) {
                //Write your code if there's no result
            }
        }
    }
...
}

public class LoginRegisterActivity extends Activity {

    private Button trialButton;

    public static final int REQUEST_CODE_REGISTER = 1;

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

        final Intent intent = new Intent();


        if (getIntent().hasExtra("showTrialButton") && getIntent().getExtras().getBoolean("showTrialButton")) {

            findViewById(R.id.trial_button).setVisibility(View.VISIBLE);

        }


        trialButton = findViewById(R.id.trial_button);
        trialButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                intent.putExtra(PreferenceKeys.TRIAL, true);
                setResult(RESULT_OK, intent);
                finish();
            }
        });
    }


}

Here is what the LOG prints

onStart onResume onResume-first if onResume-first if-onResumeCall onActivityResult onResume

I just don't get it. Does anyone know how to solve it?

1 Answers1

1

if it happens so let it, don't mess with os, Just to stop making trubles because of this you can make a wrapper for result data like this:

public class MyDataWrapper<T> {
    private T t;
    private boolean dataHandled = false;

    public MyDataWrapper(){}

    public MyDataWrapper(T t){
        this.t = t;
    }

    public T getData(){
        dataHandled = true;
        return t;
    }

    public void setData(T t){
        if(this.t != t){
            this.t = t;
            dataHandled = false
        }
    }

    public boolean isDataHandled(){
        return dataHandled;
    }
}

and in your fragment you can do like this:

class MyFragment extends ListFragment {

    private MyDataWrapper<MyData> myDataWrapper = new MyDataWrapper<>();

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        if (/* all conditions are right */){
            myDataWrapper.setData(/* the data */);
        }
    }
    @Override
    public void onResume(){
        if (!myDataWrapper.isDataHandled()){
            // do the work
        } else {
            // data handled so there is no need to handle it again
        }
    }
}
Sajjad
  • 430
  • 6
  • 17