Я пытаюсь вызвать действие, используя
startActivityForResult()
из фрагмента. Эта деятельность в основном что-то делает, а затем возвращает результат, но что действительно странно, так это то, что после завершения вызываемой операции фрагмент вызывает onStart, затем onResume, затем onActivityResult, затем onResume снова, и я не могу понять,Почему. Это вызывает столько проблем.
Вот код:
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();
}
});
}
}
Вот что печатает журнал:
onStart onResume onResume-first если onResume-first if-onResumeCall onActivityResult onResume
Я просто не понимаю. Кто-нибудь знает, как это решить?