学无先后,达者为师

网站首页 编程语言 正文

统一管理 Activity 便于随时退出程序

作者:阿咩AmieVastness 更新时间: 2022-09-25 编程语言

Android 学习笔记 —— 统一管理 Activity 便于随时退出程序

  • 统一管理 Activity 便于随时退出程序
    • 统一管理 Activity
    • 使用 Broadcast 实现强制下线功能

统一管理 Activity 便于随时退出程序

统一管理 Activity

  1. 创建 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();
        }
    }
    
  2. 创建 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);
        }
    }
    
  3. 最后别忘了修改 Activity 的父类,让它们都继承自 BaseActivity。

使用 Broadcast 实现强制下线功能

强制下线需要关闭所有 Activity,然后返回登录界面。前面已经实现了对 Activity 的同一管理,现在加入广播对其进行完善。

  1. 创建登录界面活动 LoginActivity,并让它继承自 BaseActivity,编写内部逻辑。

  2. 在对应 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(); // 让对话框显示出来
                }
            });
        }
    }
    
  3. 创建强制下线广播接收器类 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));
        }
    }
    
  4. 完善 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 都注册广播接收器,并不是一个好的方案。

原文链接:https://blog.csdn.net/AmieVastness/article/details/126977806

栏目分类
最近更新