日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

統一管理 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

欄目分類
最近更新