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?