创建活动管理类,管理产生的所有活动
public class ActivityCollector {
public static List<Activity> activities=new ArrayList<>();
public static void addActivity(Activity activity){
activities.add(activity);
}
public static void removeActivity(Activity activity){
activities.remove(activity);
}
public static void finishAll(){
for (Activity activity : activities){
//isFinishing() 用于判断 Activity 是否正在 finish
if (!activity.isFinishing()){
activity.finish();
}
}
}
}
创建所有活动的父类,接收广播
public class BastActivity extends AppCompatActivity {
private ForceOfflineReceiver receiver;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//结合添加此Activity
ActivityCollector.addActivity(this);
}
//之前都是在onCreate()和onDestroy()方法里来注册和取消注册广播接收器,这次在onResume()和onPause()方法中写
//是因为我们始终需要保证只有处于栈顶的活动才能接收这条强制下线的广播,非栈顶的活动不应该也没必要去接收这条广播
//所以写在onResume()和onPause()方法里就可以很好的解决这个问题,当活动失去栈顶的位置就会自动取消广播接收器的注册
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter=new IntentFilter();
//添加action值
intentFilter.addAction("com.android.broadcastbestpractice.FORCE_OFFLINE");
//广播接收器
receiver= new ForceOfflineReceiver();
registerReceiver(receiver,intentFilter);
}
@Override
protected void onPause() {
super.onPause();
if (receiver!=null){
//销毁广播
unregisterReceiver(receiver);
receiver=null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//集合删除此Activity
ActivityCollector.removeActivity(this);
}
class ForceOfflineReceiver extends BroadcastReceiver{
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle("警告");
builder.setMessage("你被迫离线,请再次尝试登录.");
//将对话框设为不可取消
builder.setCancelable(false);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//集合关闭所有Activity
ActivityCollector.finishAll();
Intent intent=new Intent(context,LoginActivity.class);
context.startActivity(intent);
}
});
builder.show();
}
}
}
登陆页面,继承父类
public class LoginActivity extends BastActivity {
private EditText accountEdit,passwordEdit;
private Button login;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
accountEdit=findViewById(R.id.account);
passwordEdit=findViewById(R.id.password);
login=findViewById(R.id.login);
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String account=accountEdit.getText().toString();
String password=passwordEdit.getText().toString();
if (account.equals("admin") && password.equals("12345")){
Intent intent=new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
finish();
}else {
Toast.makeText(LoginActivity.this,"帐户或密码无效",Toast.LENGTH_LONG).show();
}
}
});
}
}
跳转到的页面继承父类,写一个按钮,用来调用发送强制下线广播,在父类中接收广播,父类注释有详细说明
public class MainActivity extends BastActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button forceOffline=findViewById(R.id.force_offline);
forceOffline.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("com.android.broadcastbestpractice.FORCE_OFFLINE");
//发送广播
sendBroadcast(intent);
}
});
}
}