moveTaskToback之Activity保活思路

作者: 我是吸血鬼 | 来源:发表于2018-07-02 23:32 被阅读61次

首先看看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按键的事件。

相关文章

网友评论

    本文标题:moveTaskToback之Activity保活思路

    本文链接:https://www.haomeiwen.com/subject/rqsruftx.html