今天做了一个注销登录的功能,也就是你登录成功后,在设置界面需要注销退出到登录界面,在这里遇到一个问题就是——需要关闭
之前打开的全部页面,然后跳转到最初的登录界面。因为之前打开了多个界面,现在需要在一个界面中关闭所有页面,但是又不是直
接退出app,所以无法使用类似system.exit()等类似的方法直接杀死进程退出。现在我提供三种思路来解决这个解决这个问题。
解决思路一:
这种方法应该是大多数人最先想到的,即:使用静态变量保存每个打开的Activity的对象,或者在自定义的Application中保存每个Activity
的对象,然后在注销时利用Application获取所有保存的Activity对象,然后关闭所有的Activity。
解决思路二:
使用广播的方式,在每个要关闭的Activity中注册一个特殊的广播,在这个广播中关闭自身,然后注销广播。在注销登录操作中发送关闭
Activity的广播。
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("MainActivity", "收到广播");
if(intent.getAction().equals(Constant.logout))
{
unregisterReceiver(this);
((Activity) context).finish();
}
}
};
IntentFilter filter = new IntentFilter();
filter.addAction(Constant.logout);
registerReceiver(broadcastReceiver, filter);
在每个要关闭的页面中都注册上述的广播,在注销时只要发送这样的广播就行,记住一定要在关闭之前注销这个广播,否则会抛出广播
未注销的异常。
Intent broadCast = new Intent();
broadCast.setAction(Constant.logout);
sendBroadcast(broadCast);
解决思路三:使用Intent.FLAG_ACTIVITY_CLEAR_TOP
在android API中已经清楚的介绍了这个属性了,如果在这个注销的页面要关闭所有的Activity并且打开登录页面,那么在刚开始登录的时
时候不要关闭登录页面,那么在startActivity登录页面时,不会创建新的实例,而是将登录页面上所有的页面都clear,然后将自己放到task
的首部。
Intent intent = new Intent(SettingActivity.this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);