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

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

统一管理 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 都注册广播接收器,并不是一个好的方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿咩AmieVastness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值