Android 学习笔记 —— 统一管理 Activity 便于随时退出程序
统一管理 Activity 便于随时退出程序
统一管理 Activity
-
创建 ActivityController 活动管理器类。
public class ActivityController { // 用于存放所有 Activity 的是集合类 public static List<Activity> activities = new ArrayList<>(); public static void addActivity(Activity activity) { activities.add(activity); } public static void removeActivity(Activity activity) { activities.remove(activity); } /** 循环关闭所有 Activity 然后清空集合 */ public static void finishAll() { for (Activity activity : activities) { if (!activity.isFinishing()) { activity.finish(); } } activities.clear(); } }
-
创建 BaseActivity 类并继承自 AppCompatActivity,重写
onCreate()
和onDestroy()
方法。public class BaseActivity extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 打印当前 Activity 名 Log.i("BaseActivity", getClass().getSimpleName()); // 把当前 Activity 添加到 ActivityController 中 ActivityController.addActivity(this); } @Override protected void onDestroy() { super.onDestroy(); // 把当前 Activity 从 ActivityController 中移除 ActivityController.removeActivity(this); } }
-
最后别忘了修改 Activity 的父类,让它们都继承自 BaseActivity。
使用 Broadcast 实现强制下线功能
强制下线需要关闭所有 Activity,然后返回登录界面。前面已经实现了对 Activity 的同一管理,现在加入广播对其进行完善。
-
创建登录界面活动 LoginActivity,并让它继承自 BaseActivity,编写内部逻辑。
-
在对应 Activity 中定义发送自定义强制下线广播的方式。(以在 MainActivity 中点击按钮发送为例)
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.btn_send_force_offline_broadcast).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 构建一个提醒对话框 AlertDialog.Builder builder = new AlertDialog.Builder(context); // 给对话框设置内容 builder.setTitle("Warning") .setMessage("You are forced to be offline. Please try to login again.") .setCancelable(false) .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent intent = new Intent("com.amie.test.FORCE_OFFLINE"); // 获取本地广播管理器并发送自定义强制下线广播 LocalBroadcastManager.getInstance(this).sendBroadcast(intent); } }); builder.show(); // 让对话框显示出来 } }); } }
-
创建强制下线广播接收器类 ForceOfflineReceiver,并继承自 BroadcastReceiver,重写
onReceiver()
方法。public class ForceOfflineReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 关闭所有 Activity ActivityController.finishAll(); // 重新启动 LoginActivity context.startActivity(new Intent(context, LoginActivity.class)); } }
-
完善 BaseActivity,重写
onResume()
和onPause()
方法。public class BaseActivity extends AppCompatActivity { private final LocalBroadcastManager localBroadcastManager; private ForceOfflineReceiver offlineReceiver; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { /**...*/ } @Override protected void onResume() { super.onResume(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.amie.test.FORCE_OFFLINE"); offlineReceiver = new ForceOfflineReceiver(); localBroadcastManager = LocalBroadcastManager.getInstance(this); localBroadcastManager.registerReceiver(offlineReceiver, intentFilter); } @Override protected void onPause() { super.onPause(); if (offlineReceiver != null) { localBroadcastManager.unregisterReceiver(offlineReceiver); offlineReceiver = null; } } @Override protected void onDestroy() { /**...*/ } }
这里选择在 onResume()
和 onPause()
方法中注册和注销是因为强制下线广播只需要栈顶的 Activity 能接收到就可以了,非栈顶的 Activtiy 不需要也不应该去接收该广播。但这同样也有缺点,那就是会给每个 Activity 都注册广播接收器,并不是一个好的方案。