广播通知强制下线

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接口,调用了退出登录的方法,并处理结果。