網站首頁 編程語言 正文
Android 學習筆記 —— 統一管理 Activity 便于隨時退出程序
- 統一管理 Activity 便于隨時退出程序
- 統一管理 Activity
- 使用 Broadcast 實現強制下線功能
統一管理 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 都注冊廣播接收器,并不是一個好的方案。
原文鏈接:https://blog.csdn.net/AmieVastness/article/details/126977806
- 上一篇:CSS-元素隱藏的兩種主要方式
- 下一篇:python學習筆記之循環語句
相關推薦
- 2023-03-20 C#中如何生成安裝包_C#教程
- 2022-06-06 element ui表單el-form的label自適應寬度
- 2023-05-20 python中split(),?os.path.split()和os.path.splitext()
- 2022-05-04 分享3個非常實用的?Python?模塊_python
- 2022-06-29 超級詳細的nginx負載均衡配置_nginx
- 2022-07-16 RabbitMQ 中 Connection 和 Channel 詳解
- 2022-07-01 使用Python讀寫多個sheet文件_python
- 2023-02-10 python自定義函數中的return和print使用及說明_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支