一种Activity生命周期的方法

之前看Glide的源码中有看到过,但是Glide的代码包得严严实实,确实解不开。刚好有个业务场景,可能会导致内存泄漏,我提到这种方法,但是感觉有点复杂,就没做上去,下午花了一点点时间,重新理清了下思路,发现比预料中简单不少。

先说原理吧:

Activity中的Fragemnt的生命周期都会被回调,那么我们放一个空的Fragemnt进去,在Fragemnt的onDestory就可以做我们想做的事情了(eg:回收 and so on)

下面是demo的代码:

45行代码,专门对某个单例做了处理。在pixel、mumu模拟器上测试可用

public class LifeFunction {

    private static LifeFunction sInstance = new LifeFunction();
    public static LifeFunction getInstance(){
        return sInstance;
    }

    private LifeFunction(){
    }

    private SimpleCallback mCallback = null;
    private String TAG = LifeFunction.class.getSimpleName();

    public void register(Context withContext,SimpleCallback callback){
        this.mCallback = callback;
        if(withContext instanceof Activity){
            FragmentManager fm = ((Activity) withContext).getFragmentManager();
            RequestManagerFragment current = (RequestManagerFragment) fm.findFragmentByTag(TAG);
            if (current == null) {
                current = new RequestManagerFragment();
                fm.beginTransaction().add(current, TAG).commitAllowingStateLoss();
            }
        }
    }

    public void unregister(){
        this.mCallback = null;
    }

    public void call(){
        if(this.mCallback != null)this.mCallback.onCall();
    }

    public interface SimpleCallback{
        void onCall();
    }

    public static class RequestManagerFragment extends Fragment{
        @Override
        public void onDestroy(){
            super.onDestroy();
            Log.e("TAG","unregister fragment");
            LifeFunction.getInstance().unregister();
        }
    }
}

简单的测试代码如下

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

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

        findViewById(R.id.test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LifeFunction.getInstance().call();
            }
        });
    }

}
public class SecondActivity extends Activity{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LifeFunction.getInstance().register(SecondActivity.this, new LifeFunction.SimpleCallback() {
            @Override
            public void onCall() {
                Log.e("TAG","onCall");
                Toast.makeText(SecondActivity.this, "test", Toast.LENGTH_SHORT).show();
            }
        });

        findViewById(R.id.test).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LifeFunction.getInstance().call();
            }
        });
    }
}

PS:如果你在nanny上看到这篇文章,那就是我发的 : )

猜你喜欢

转载自blog.csdn.net/yeshennet/article/details/80199134