Android開發(fā)Activity管理工具類的操作方法
1. 問題描述
在Android開發(fā)過程中,從A
頁面跳轉(zhuǎn)到B
頁面(不要在A頁面調(diào)用finish()),如果在B
頁面調(diào)用System.exit(0)
方法,并不能退出app,而是又重新啟動app。原因是從A
頁面跳轉(zhuǎn)到B
頁面的時候,沒有把A
銷毀掉,從而導(dǎo)致app被重啟,所以需要對Activity
進(jìn)行管理起來
2. Activity管理工具類 (Java實(shí)現(xiàn))
下面是一個完整的Activity管理工具類實(shí)現(xiàn),可以幫助你管理應(yīng)用中的所有Activity,方便一鍵退出應(yīng)用、獲取當(dāng)前Activity等操作。
/** * Activity管理工具類 */ public class ActivityManager { private static ActivityManager instance; private Stack<Activity> activityStack; // Activity棧 private ActivityManager() { } /** * 單例模式 */ public static ActivityManager getInstance() { if (instance == null) { synchronized (ActivityManager.class) { if (instance == null) { instance = new ActivityManager(); } } } return instance; } /** * 添加Activity到堆棧 */ public void addActivity(Activity activity) { if (activityStack == null) { activityStack = new Stack<>(); } activityStack.add(activity); } /** * 獲取當(dāng)前Activity(堆棧中最后一個壓入的) */ public Activity currentActivity() { if (activityStack == null || activityStack.isEmpty()) { return null; } return activityStack.lastElement(); } /** * 結(jié)束當(dāng)前Activity(堆棧中最后一個壓入的) */ public void finishActivity() { if (activityStack == null || activityStack.isEmpty()) { return; } Activity activity = activityStack.lastElement(); finishActivity(activity); } /** * 結(jié)束指定的Activity */ public void finishActivity(Activity activity) { if (activity != null && !activity.isFinishing()) { activityStack.remove(activity); activity.finish(); } } /** * 結(jié)束指定類名的Activity */ public void finishActivity(Class<?> cls) { for (Activity activity : activityStack) { if (activity.getClass().equals(cls)) { finishActivity(activity); break; } } } /** * 結(jié)束所有Activity */ public void finishAllActivity() { if (activityStack == null) return; for (Activity activity : activityStack) { if (activity != null && !activity.isFinishing()) { activity.finish(); } } activityStack.clear(); } /** * 退出應(yīng)用程序 */ public void exitApp() { try { finishAllActivity(); // 退出JVM,釋放所有內(nèi)存 System.exit(0); // 殺死該應(yīng)用進(jìn)程 android.os.Process.killProcess(android.os.Process.myPid()); } catch (Exception e) { e.printStackTrace(); } } /** * 獲取指定類名的Activity */ public Activity getActivity(Class<?> cls) { if (activityStack == null) return null; for (Activity activity : activityStack) { if (activity.getClass().equals(cls)) { return activity; } } return null; } /** * 移除Activity(但不finish) */ public void removeActivity(Activity activity) { if (activity != null && activityStack != null) { activityStack.remove(activity); } } /** * 返回棧中Activity的數(shù)量 */ public int getActivityCount() { return activityStack == null ? 0 : activityStack.size(); } }
3. 使用說明
初始化:在BaseActivity或每個Activity的onCreate()方法中調(diào)用:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityManager.getInstance().addActivity(this); }
在Activity銷毀時移除:在onDestroy()方法中調(diào)用:
@Override protected void onDestroy() { super.onDestroy(); ActivityManager.getInstance().removeActivity(this); }
常用方法示例:
// 獲取當(dāng)前Activity Activity currentActivity = ActivityManager.getInstance().currentActivity(); // 結(jié)束當(dāng)前Activity ActivityManager.getInstance().finishActivity(); // 結(jié)束指定Activity ActivityManager.getInstance().finishActivity(MainActivity.class); // 退出應(yīng)用程序 ActivityManager.getInstance().exitApp(); // 結(jié)束所有Activity但不退出應(yīng)用 ActivityManager.getInstance().finishAllActivity();
4. 注意事項(xiàng)
- 需要在每個Activity的生命周期中正確添加和移除Activity
- 退出應(yīng)用時建議使用exitApp()方法,它會清理所有Activity并退出進(jìn)程
- 這個工具類使用了單例模式,確保全局只有一個實(shí)例管理所有Activity
到此這篇關(guān)于Android開發(fā)Activity管理工具類的文章就介紹到這了,更多相關(guān)Android Activity管理工具類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)之多線程的三種實(shí)現(xiàn)方式
這篇文章主要介紹了Java基礎(chǔ)之多線程的三種實(shí)現(xiàn)方式,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Java 獲取服務(wù)器環(huán)境的實(shí)例詳解
這篇文章主要介紹了Java 獲取服務(wù)器環(huán)境的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例和輸出結(jié)果,希望能幫助大家理解,需要的朋友可以參考下2017-07-07Java字節(jié)與字符流永久存儲json數(shù)據(jù)
本篇文章給大家詳細(xì)講述了Java字節(jié)與字符流永久存儲json數(shù)據(jù)的方法,以及代碼分享,有興趣的參考學(xué)習(xí)下。2018-02-02Java使用try-with-resources實(shí)現(xiàn)自動解鎖
項(xiàng)目中使用Redission分布式鎖,每次使用都需要顯示的解鎖,很麻煩,Java 提供了 try-with-resources 語法糖,它不僅可以用于自動關(guān)閉流資源,還可以用于實(shí)現(xiàn)自動解鎖,本文將介紹如何利用 try-with-resources 實(shí)現(xiàn)鎖的自動釋放,需要的朋友可以參考下2025-01-01