前言
在Android开发过程中,最常见的功能便是“异地登录,强制下线”了。那么,今天就讲讲用广播实现"强迫下线"的功能。
今天涉及的知识有:
- 需求场景
- 实现"强迫下线"逻辑
- "强迫下线"具体实施
- 效果图和项目结构图
- 其他部分代码及注意事项
5.1 AppActivity代码
5.2 进入登录界面逻辑
5.3 singleTask启动模式
5.4 singletask接收值注意项
先看下效果图吧
1.gif
一.需求场景
"强迫下线"的表现场景为,当用户的账号在其他设备上登录后,当前设备上无论app处在哪个界面,都要及时弹出"异地登录"的提示框。这种使用场景十分常见,而实现技术难点就在于:无论app处在哪个界面都要弹框。
二. 实现"强迫下线"逻辑
先写一个所有Activity的父类AppActivity,然后重写Activity的 onResume() 方法和 onPause() 方法,然后在 onResume()中注册广播,在onPause()中注销广播,在AppActivity中处理广播接收器,在接收器中弹出dialog实现关闭所有Activity并跳转到登录界面的逻辑。这里需要注意的是,你还要自己写一个类用于管理所有Activity的关闭问题。最后在需要的强制下线的地方,发起弹出强制下线的广播。
三. "强迫下线"具体实施
首先需要一个Activity的父类AppActivity,然后写一个登录界面,我是将登录逻辑写在MainActivity 中,现在贴出MainActivity代码:
public class MainActivity extends AppActivity implements View.OnClickListener{
private TextView mTv;
private EditText mEdtName;
private EditText mEdtPassword;
private Button mBtn;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
setListener();
}
private void initData() {
mTv = findViewById(R.id.tv);
mBtn = findViewById(R.id.btn);
mEdtName = findViewById(R.id.edit_name);
mEdtPassword = findViewById(R.id.edit_password);
mEdtName.setText("小火龙");
}
private void setListener() {
mBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
String password=mEdtPassword.getText().toString();
if(!"12345".equals(password)){
ToastUtil.shortShow("密码错误,请重新登录");
return;
}
//跳转主页
Intent intent = new Intent(MainActivity.this, HomeActivity.class);
startActivity(intent);
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
然后跳转到下一界面HomeActivity,下面贴出HomeActivity代码:
public class HomeActivity extends AppActivity implements View.OnClickListener{
private Button mBtn;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
mBtn = findViewById(R.id.btn);
mBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn:
//强迫下线通知
AppLocalReceiver receiver = new AppLocalReceiver();
receiver.sendToBroadcast(HomeActivity.this, AppActivity.FORCED_OFFLINE, null);
break;
default:
break;
}
}
}
四.效果图和项目结构图
效果图
1.gif
项目结构图
image.png