Android 广播强制下线
ActivityCollector用于管理活动, BaseActivity作为所有活动的父类,这在之前有讲过,可 以查看ActivityTest;
1.新建LoginActivity,修改活动的布局activity_login.xml,并在AndroidManifest.xml中将其修改为主活动;
2.修改MainActivity和activity_main.xml加入强制下线功能;需要注意的是我们是通过广播实现前置下线的,在这里,为了保证强制下线的功能功能能不会依附于任何一个界面,我们将其定义在BaseActivity里。
具体查看下列代码,需要注意的是这里的广播注册和取消注册是在onResume()和onPause()这两个生命周期函数的,这样做是为了保证只有处在栈顶的活动才能接受到这条广播。具体代码如下
public class BaseActivity extends AppCompatActivity {
private ForceOfflineReceiver receiver;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}
@Override
protected void onResume() {
//在这里注册广播是保证只有处于栈顶的活动才能收到强制下线的广播
super.onResume();
IntentFilter intentFilter= new IntentFilter();
intentFilter.addAction("lyp.com.broadcastbestpracticce.FORCE_OFFLINE");
receiver = new ForceOfflineReceiver();
registerReceiver(receiver,intentFilter);//注册广播
}
@Override
protected void onPause() {
super.onPause();
if(receiver!=null){
unregisterReceiver(receiver);
receiver=null;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
ActivityCollector.removeActivity(this);
}
class ForceOfflineReceiver extends BroadcastReceiver{
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("警告");
builder.setMessage("你已经被强制下线,请重新尝试登陆。");
builder.setCancelable(false);
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll();//销毁所有活动
Intent intent1=new Intent(context,LoginActivity.class);
context.startActivity(intent1);//重新启动LoginActivity
}
});
builder.show();
}
}
}
最终运行截图:
封装了一个关于 SharedPreferences 的工具类preUtils,同时修改了LoginActivity和布局文件,具体修改可见代码提交历史,关于SharedPreferences在另外一个项目SharePreferencesTest中讲解。 运行结果: