【发布时间】:2019-11-07 12:53:06
【问题描述】:
我正在尝试使用
调用活动startActivityForResult()
来自一个片段。那个activity基本上是做了一些事情然后返回结果,但是发生了什么,真正奇怪的是,在被调用的activity完成之后,fragment调用了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();
}
});
}
}
这是 LOG 打印的内容
onStart 恢复 简历优先 if-onResume-first if-onResumeCall onActivityResult 简历
我只是不明白。有人知道怎么解决吗?
【问题讨论】:
-
可能你有两个片段,尝试将 hashCode() 添加到你的日志中。
-
试过了,hashCode是一样的,谢谢回复
标签: android fragment onactivityresult onresume fragment-lifecycle