moveTaskToback之Activity保活思路

首先看看moveTaskToBack的代码

 public boolean moveTaskToBack(boolean nonRoot) {
        try {
            return ActivityManager.getService().moveActivityTaskToBack(
                    mToken, nonRoot);
        } catch (RemoteException e) {
            // Empty
        }
        return false;
}

当nonRoot 为 false 时,当前activity必须为栈底,也就是最底层的activity,如果其他activity没有及时finish掉,就会出现异常,导致崩溃等情况的发生;nonRoot 为 true 时,不需要考虑当前activity是否在栈底。

在Activity中我们可以重载这个方法

public class BaseActivity extends AppCompatActivity {
    ......
    @Override
    public boolean moveTaskToBack(boolean nonRoot) {
        return super.moveTaskToBack(nonRoot);
    }
    ......
}

所以我们可以在BaseActiivty中重载moveTaskToBack(boolean nonRoot),对于nonRoot的情况作出判断,这样就避免出现崩溃情况的发生。
代码如下:

public class BaseActivity extends AppCompatActivity {
    ......
    @Override
    public boolean moveTaskToBack(boolean nonRoot) {
        if(!nonRoot){
            if(!isTaskRoot()){
                return false;
            }
        }
        return super.moveTaskToBack(nonRoot);
    }
    ......
}

通过isTaskRoot()判断当前的Activity是否位于栈中的最底层,如果为isTaskRoot()=false的话就直接返回false,则表明当前Activity进入后台失败。

默认的KEYCODE_BACK事件,Actiivty会被finish()。

为了避免我们的首屏退出后栈中没有了Actiivty,我们需要在MainActivity重写onKeyDown的KEYCODE_BACK事件。通过moveTaskToBack()把Activity退回栈中,而不是finish()。

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            moveTaskToBack(true);
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

其实,通过这种方式我们相当于模拟了HOME按键的事件。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容