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頁面的時(shí)候,沒有把A銷毀掉,從而導(dǎo)致app被重啟,所以需要對Activity進(jìn)行管理起來
2. Activity管理工具類 (Java實(shí)現(xiàn))
下面是一個(gè)完整的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(堆棧中最后一個(gè)壓入的)
*/
public Activity currentActivity() {
if (activityStack == null || activityStack.isEmpty()) {
return null;
}
return activityStack.lastElement();
}
/**
* 結(jié)束當(dāng)前Activity(堆棧中最后一個(gè)壓入的)
*/
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或每個(gè)Activity的onCreate()方法中調(diào)用:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.getInstance().addActivity(this);
}在Activity銷毀時(shí)移除:在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)
- 需要在每個(gè)Activity的生命周期中正確添加和移除Activity
- 退出應(yīng)用時(shí)建議使用exitApp()方法,它會清理所有Activity并退出進(jìn)程
- 這個(gè)工具類使用了單例模式,確保全局只有一個(gè)實(shí)例管理所有Activity
到此這篇關(guān)于Android開發(fā)Activity管理工具類的文章就介紹到這了,更多相關(guān)Android Activity管理工具類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java某個(gè)經(jīng)緯度是否在genjson文件中問題
GeoJSON是一種用于地理空間信息數(shù)據(jù)交換的格式,基于JSON,要判斷某個(gè)經(jīng)緯度是否在某個(gè)區(qū)域內(nèi),首先需要解析GeoJSON文件,確定區(qū)域邊界,然后使用經(jīng)緯度進(jìn)行比較2024-11-11
SpringBoot查看項(xiàng)目配置信息的幾種常見方法
這篇文章主要為大家詳細(xì)介紹了查看Spring Boot項(xiàng)目所有配置信息的幾種方法,包括 Actuator端點(diǎn),日志輸出,代碼級獲取等方式并附帶詳細(xì)步驟和示例,希望對大家有一定的幫助2025-04-04
springBoot啟動時(shí)讓方法自動執(zhí)行的幾種實(shí)現(xiàn)方式
這篇文章主要介紹了springBoot啟動時(shí)讓方法自動執(zhí)行的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Java實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)提取所需知識點(diǎn)
這篇文章主要介紹了Java實(shí)現(xiàn)網(wǎng)絡(luò)數(shù)據(jù)提取所需知識點(diǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java AbstractMethodError原因案例詳解
這篇文章主要介紹了Java AbstractMethodError原因案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

