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