Android广播的使用
关于使用广播通知强制下线的功能
关于在那里创建广播接收器
例子:一个账号已经登录,在另一个手机上再一次登录这个账号,这时候就需要提醒用户“账号有在别处登录,请重新登录”,强制下线,跳转到登录界面。
- 个人认为应该在Base类中创建广播接收器,并销毁,这样就可以在任何地方响应广播
- 广播类型应该为动态添加
下面我将在BaseActivity中创建
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| private JudgeLoginReceiver judgeLoginReceiver; public static String signInAction = "LOGIN.DilDil.ACTION";
@Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); onCreateView(savedInstanceState); ... initBroadcastReceiver(); } private void initBroadcastReceiver() { if (judgeLoginReceiver != null) { IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(signInAction); registerReceiver(judgeLoginReceiver, intentFilter); } else { judgeLoginReceiver = new JudgeLoginReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(signInAction); registerReceiver(judgeLoginReceiver, intentFilter); } } @Override protected void onDestroy() { if (judgeLoginReceiver != null) { unregisterReceiver(judgeLoginReceiver); } super.onDestroy(); }
|
上面的代码中,我首先创建了要响应的Action(signInAction),之后在onCreate中初始化广播。
在initBroadcastReceiver中,为了防止反复创建,于是判断是否已经存在,没有就创建,有就直接注册。别忘了要在onDestroy取消注册
接下来还需要创建一个类来继承BroadcastReceiver
那么创建一个名为JudgeLoginReceiver的类来继承BroadcastReceiver
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| private static class JudgeLoginReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { new MaterialDialog.Builder(context) .title(R.string.loginWarning) .content(R.string.thisAccountHasSigned) .positiveText(R.string.determine) .cancelable(false) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { ApiService apiService = ApiEngine.getInstance().getApiService(); apiService.Logout() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<LogoutBean>() { @Override public void onSubscribe(@io.reactivex.annotations.NonNull Disposable d) {
}
@Override public void onNext(@io.reactivex.annotations.NonNull LogoutBean logoutBean) { SharePreferenceUtil.getInstance(context).remove("cookie"); ActivityUtils.startActivity(LoginActivity.class); }
@Override public void onError(@io.reactivex.annotations.NonNull Throwable e) { XToastUtils.error(R.string.networkError); }
@Override public void onComplete() {
} }); } }) .show(); } }
|
继承BroadcastReceiver之后需要重写onReceive方法,这个方法是用来处理接收到广播之后的行为。
我在onReceive中创建了一个提示框。
1 2 3 4 5 6
| title 是提示框的标题 content 是内容 positiveText 是确定按钮的文字 cancelable 是指是否可以点击外面退出 onPositive 是指确实按钮的点击监听 不写取消按钮就默认没有取消按钮
|
接下来,我在点击事件中获取Api接口,调用了退出登录的方法,并处理结果。