此处UI界面并不会写的很好看,就是一个简单的类似于强制下线功能,要用到的类如下:
这些类的主要做用:
- ActivityCollector:用来管理Activity,添加和删除,全部销毁。
- BaseActivity:这是一个中间类,用来实现将创建好的Activity添加到ActivityCollector中,此类继承AppCompatActivity,并且广播接收器也是写在这个类中的。
- LoginActivity:主要功能就是一个登录界面的实现。
- MainActivity:点击按钮发送一条广播。
此处要注意的是MainActivity,LoginActivity都是继承BaseActivity的,因为BaseActivity是继承AppCompatActivity的,所以并不会影响这两个活动的正常使用。
将主活动设置为LoginActivity,就是应用启动打开的第一个界面是LoginActivity的内容。
代码如下:
ActivityCollector:
/**
* 此类用来管理活动
*/
public class ActivityCollector {
// 创建一个Activity的列表
public static List<Activity> activities = new ArrayList<>();
// 添加activity到activities中去
public static void addActivity(Activity activity) {
activities.add(activity);
}
// 将activity从activities中移除
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
// 销毁所有的Activity,也就是将activities中的activity都移除
public static void finishAll() {
for (Activity activity : activities) {
if (!activity.isFinishing()) {
activity.finish();
}
}
}
}
BaseActivity:
/**
* 将此类做为所有Activity的父类,就可以轻松的管理Activity了
*/
public class BaseActivity extends AppCompatActivity {
private ForceOfflineReceiver forceOfflineReceiver;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//将继承BaseActivity类的Activity添加到ActivityCollector的列表中去
ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
// 将销毁的Activity从列表中移除
ActivityCollector.removeActivity(this);
}
/**
* 在应用重新开始时注册广播接收器
* 在应用暂停时取消注册广播接收器
* 这样的好处是始终保证只有处于栈顶的活动才能接收到com.my.force_line这条广播
*/
// 应用重新开始时调用
@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.my.force_line");
forceOfflineReceiver = new ForceOfflineReceiver();
registerReceiver(forceOfflineReceiver, intentFilter);
}
// 应用暂停时所调用
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(forceOfflineReceiver);
}
// 创建一个广播接收器
class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
// 写一个强制下线的警告框
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("警告");
builder.setMessage("你以被强制下线,请重新登录");
//使此警告框无法被移除
builder.setCancelable(false);
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 销毁所有活动
ActivityCollector.finishAll();
// 重新启动LoginActivity
Intent intent = new Intent(context,LoginActivity.class);
context.startActivity(intent);
}
});
builder.show();
}
}
}
LoginActivity:
public class LoginActivity extends BaseActivity {
private Button btn_login;
EditText et_account, et_password;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btn_login = findViewById(R.id.login);
et_account = findViewById(R.id.account);
et_password = findViewById(R.id.password);
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 如果帐号等于liang,密码等于12345就登录成功
if (et_account.getText().toString().equals("liang") && et_password.getText().toString().equals("12345")) {
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}else {
Toast.makeText(LoginActivity.this, "帐号或密码错误", Toast.LENGTH_SHORT).show();
}
}
});
}
}
LoginActivity的xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<EditText
android:id="@+id/account"
android:hint="请输入帐号"
android:inputType="text"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/password"
android:hint="请输入密码"
android:inputType="textPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/login"
android:text="登录"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
MainActivity:
public class MainActivity extends BaseActivity {
private Button force_offline;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
force_offline = findViewById(R.id.btn_force_offline);
// 点击按钮发送一个为com.my.force_line广播
force_offline.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 此处的com.my.force_line是自定义的一个广播
Intent intent = new Intent("com.my.force_line");
// 发送广播,此处发送的是标准广播
sendBroadcast(intent);
}
});
}
}
MainActivity的xml代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:id="@+id/btn_force_offline"
android:text="强制下线"
android:textSize="20sp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
转载自原文链接, 如需删除请联系管理员。
原文链接:实现一个类似QQ的强制下线功能,转载请注明来源!