【问题标题】:How to fix: onResume get called both before and after onActivityResult when the started activity finishes如何修复:当启动的活动完成时,在 onActivityResult 之前和之后都会调用 onResume
【发布时间】: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


【解决方案1】:

如果它发生了,那就顺其自然吧,不要弄乱操作系统,只是为了停止制造麻烦,你可以像这样为结果数据制作一个包装器:

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;
    }
}

在你的片段中你可以这样做:

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
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2012-02-26
    • 2020-11-21
    相关资源
    最近更新 更多