项目场景:
若账号出现异常登录,通知用户下线退出到登陆界面
提示:在界面上弹出一个对话框,让用户无法进行任何其他操作,必须点击对话框中的确定按钮,然后返回到登录界面。
技术要点:
1)不用每个页面都编写一个弹出对话框逻辑,借助广播机制和BaseActivity来实现这一功能
2)强制下线功能需要关闭所有的活动,返回登陆界面,所以需要一个ActivityColleter来管理所有的活
业务分析:
1、登录QQ:
通过LoginBtn按钮的点击事件:
判断账号密码是否正确?
- intent跳转页面
2、实现强制下线:
- 强制下线,需要关掉所有的Activity,然后重新启动LoginActivity
1)新建ActivityColleter类去管理所有的活动
2)需要一个BaseActivity继承AppcampatActivity作为所有Activity的父类
3)自定义通知:‘强制下线通知’,适当的时候通过Intent发送通知
4)BaseActivity类中新建内部类继承BroadcastReceiver,重写onReceiver方法
解决方案:
1、ActivityColleter.java
//to controll all of activities in this project
public class ActivityColleter {
//ActivityList
private static List<Activity> activityList = new ArrayList<>();
//addActivity
public static void addActivity(Activity activity){
activityList.add(activity);
}
//removeActivity
public static void removeActivity(Activity activity){
activityList.remove(activity);
}
//finishAllActivity
public static void finishAllActivity(){
for(Activity activity:activityList){
if(!activity.isFinishing()){
activity.finish();
}
}
}
}
2、BaseActivity
//BaseActivity is the ancestor of all Activity
//in other words,it is the father of all of them
public class BaseActivity extends AppCompatActivity {
//注册ForceOfflineReceiver receiver
private ForceoffLineReceiver receiver;
//Override OnCreate() function of Activity
//when one activity is about to create ,baseActivity will controll it to be added into ActivityList
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityColleter.addActivity(this);
Log.i("Tsss","BaseActivity.onCreate() is executed");
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityColleter.removeActivity(this);
}
@Override
protected void onResume() {
super.onResume();
//当一个活动从新获取到栈顶位置时,会自动注册广播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcastbestpractice.FORCE_OFFLINE");
receiver=new ForceoffLineReceiver();
registerReceiver(receiver,intentFilter);
Log.i("Tsss","BaseActivity.onResume() is executed,register Receiver");
}
@Override
protected void onPause() {
super.onPause();
//当一个活动失去栈顶位置时,会自动取消广播接收器的注册
if(receiver!=null){
unregisterReceiver(receiver);
Log.i("Tsss","BaseActivity.onPause() is executed,Unregister Receiver");
}
}
//自定义内部类
public class ForceoffLineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
//接收到广播后,进行的逻辑处理
//1、构建一个对话框,并设置头,消息,是否可取消,确定按钮以及按钮单击事件
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle("Warning");
builder.setMessage("you are forced to be offline,Please try again");
builder.setCancelable(false);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//销毁所有的活动
ActivityColleter.finishAllActivity();
//重新启动LoginActivity
Intent intent = new Intent(context,LoginActivity.class);
context.startActivity(intent);
}
});
builder.show();
}
}
}
3、欢迎页面:SecondActivity
public class SecondActivity extends BaseActivity implements View.OnClickListener {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.second_layout);
//按钮单击事件
Button force_offline_btn = findViewById(R.id.force_offline);
force_offline_btn.setOnClickListener(this);
Log.i("Tsss","SecondActivity.onCreate() is executed");
//get intent
Intent intent = getIntent();
//get data
String user = intent.getExtras().getString("user");
//show data
TextView textView = findViewById(R.id.user);
textView.setText(textView.getText()+user);
}
//按钮触发强制下线广播
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.force_offline:
//发送force offline broadcast[这条广播不是系统自带的,而是自定义的]
Intent intent = new Intent("com.example.broadcastbestpractice.FORCE_OFFLINE");
sendBroadcast(intent);
break;
}
}
}