Android开发--广播--强制用户下线

项目场景:

若账号出现异常登录,通知用户下线退出到登陆界面

提示:在界面上弹出一个对话框,让用户无法进行任何其他操作,必须点击对话框中的确定按钮,然后返回到登录界面。


技术要点:

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;
        }
    }
}

参考书籍:https://www.baidu.com/link?url=QZZGyEIlKxj4NjHFLiAMvnrKGvDMYU_KWNUDvX6HjxSven6rVugny1tB81FzcEhPg5XbsVlsJYlGk4oCymlVdgW-9jVfPqgoCa0qhThRLfAZdaPOi-XOZZOt0vMdZ7NCPiuCj9YskVtB23T5K7HhrdvAvsz-i9eKuhOaeqe9Lklrg5CCPOplwcaxEZ_XK7Bo&wd=&eqid=a40cfd5f00024864000000025f73e3b0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值