强制下线功能需要先关闭掉所有的活动,然后回到登录界面.前面第二章的最佳实现已经实现了关闭所有活动的功能了.
* 1.我们先创建一个ActivityCollector类用于管理所有的活动,里面定义了一个Activity集合,还有方法,这些方法用于
* 将这个Activity集合中的元素添加,移除,和finish所有的Activity元素.
*
* 2.再定义一个BaseActivity,这是所有类
* 的父类,待会儿让所有类继承自这个类,这个类里面onCreate方法里面是添加当前Activity到上面那个集合里面去.
* onDestroy()方法里面调用ActivityCollector类的方法移除当前Activity,因为已经销毁了,不需要再管理了.
*
* 3.写一个登录界面,登录成功后是主界面,主界面里面放一个按钮,按钮的点击事件是发送一条自定义的广播.
* 这条广播就是通知程序强制用户下线的,也就是说强制用户下线的逻辑并不是写在MainActivity里的,而是
* 应该写在接收这条广播接收器里面,这样强制下线功能就不会依附于任何的界面,不管是在程序的任何地方,只需要
* 发出这样一条广播,就可以完成强制下线的操作了
*
* 4.新建一个类,ForceOfflineReceiver,这是广播的接收器,继承自BroadcastReceiver.在onReceive()
* 里面创建一个对话框,这个对话框需要设置类型为TYPE_SYSTEM_ALERT,否则无法弹出对话框.而且这个对话框
* 用户不能取消.用户点击确定后,调用LoginActivity(登录界面),在广播里面调用活动,需要加入
* FLAG_ACTIVITY_NEW_TASK这个标志.实现了强制下线.
*
* 1.我们先创建一个ActivityCollector类用于管理所有的活动,里面定义了一个Activity集合,还有方法,这些方法用于
* 将这个Activity集合中的元素添加,移除,和finish所有的Activity元素.
*
* 2.再定义一个BaseActivity,这是所有类
* 的父类,待会儿让所有类继承自这个类,这个类里面onCreate方法里面是添加当前Activity到上面那个集合里面去.
* onDestroy()方法里面调用ActivityCollector类的方法移除当前Activity,因为已经销毁了,不需要再管理了.
*
* 3.写一个登录界面,登录成功后是主界面,主界面里面放一个按钮,按钮的点击事件是发送一条自定义的广播.
* 这条广播就是通知程序强制用户下线的,也就是说强制用户下线的逻辑并不是写在MainActivity里的,而是
* 应该写在接收这条广播接收器里面,这样强制下线功能就不会依附于任何的界面,不管是在程序的任何地方,只需要
* 发出这样一条广播,就可以完成强制下线的操作了
*
* 4.新建一个类,ForceOfflineReceiver,这是广播的接收器,继承自BroadcastReceiver.在onReceive()
* 里面创建一个对话框,这个对话框需要设置类型为TYPE_SYSTEM_ALERT,否则无法弹出对话框.而且这个对话框
* 用户不能取消.用户点击确定后,调用LoginActivity(登录界面),在广播里面调用活动,需要加入
* FLAG_ACTIVITY_NEW_TASK这个标志.实现了强制下线.
*
* 5.在应用程序的配置文件中,需要声明权限(调用了系统级别的对话框),声明广播.自定义的广播.
下面是广播接收器的代码
public class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("Warning");
dialogBuilder.setMessage("You are forced to be offline. Please try to login again");
dialogBuilder.setCancelable(false); //将对话框设置为不可取消
dialogBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll(); //销毁所有活动
//启动活动
Intent intent = new Intent(context,LoginActivity.class);
//由于是在广播里启动活动,所以需要加入FLAG_ACTIVITY_NEW_TASK这个标志
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent); //重新启动LoginActivity
}
});
AlertDialog alertDialog = dialogBuilder.create();
//需要设置AlertDialog的类型,保证在广播接收器中可以正常弹出
//需要把对话框的类型设为TYPE_SYSTEM_ALERT,不然它将无法在广播接收器里弹出
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
alertDialog.show();
}
}