Once we know that the fragment can only receive the callback it requests, we can use it to decouple the logic of onActivityResult in the activity. In general, onActivityResult() will have various case judgments if there are multiple callback results in an activity, and this design interrupts streaming writing. So let’s just create a uI-free fragment for a precise receiver so we can never write onActivityResult() again.

Fragments:

/** * @author Kale * @date 2018/4/13 */ public class OnActResultEventDispatcherFragment extends Fragment { public static  final String TAG ="on_act_result_event_dispatcher";

    private SparseArray<ActResultRequest.Callback> mCallbacks = new SparseArray<>();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    public void startForResult(Intent intent, ActResultRequest.Callback callback) {
        mCallbacks.put(callback.hashCode(), callback);
        startActivityForResult(intent, callback.hashCode());
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        ActResultRequest.Callback callback = mCallbacks.get(requestCode);
        mCallbacks.remove(requestCode);

        if(callback ! = null) { callback.onActivityResult(resultCode, data); }}}Copy the code

Request encapsulation class:

public class ActResultRequest {

    private OnActResultEventDispatcherFragment fragment;

    public ActResultRequest(Activity activity) {
        fragment = getEventDispatchFragment(activity);
    }

    private OnActResultEventDispatcherFragment getEventDispatchFragment(Activity activity) {
        final FragmentManager fragmentManager = activity.getFragmentManager();

        OnActResultEventDispatcherFragment fragment = findEventDispatchFragment(fragmentManager);
        if (fragment == null) {
            fragment = new OnActResultEventDispatcherFragment();
            fragmentManager
                    .beginTransaction()
                    .add(fragment, OnActResultEventDispatcherFragment.TAG)
                    .commitAllowingStateLoss();
            fragmentManager.executePendingTransactions();
        }
        return fragment;
    }

    private OnActResultEventDispatcherFragment findEventDispatchFragment(FragmentManager manager) {
        return(OnActResultEventDispatcherFragment) manager.findFragmentByTag(OnActResultEventDispatcherFragment.TAG); } public void startForResult(Intent intent, Callback callback) { fragment.startForResult(intent, callback); } public interface Callback { void onActivityResult(int resultCode, Intent data); }}Copy the code

Code for sending requests and listening for requests:

Intent intent = new Intent(this, SecondActivity.class);

request.startForResult(intent, new ActResultRequest.Callback() {
    @Override
    public void onActivityResult(int resultCode, Intent data) {
        Toast.makeText(MainActivity.this, ""+ resultCode, Toast.LENGTH_SHORT).show(); }});Copy the code

An aside:

The latest support package has solved the problem that the fragment in the inner layer cannot receive the result when the fragment is nested. Please update the dependency in time.