退出Android程序時(shí)清除所有activity的實(shí)現(xiàn)方法
本文實(shí)例講述了退出Android程序時(shí)清除所有activity的方法。分享給大家供大家參考,具體如下:
在一個(gè)項(xiàng)目中,要退出android程序,試了restartPackage、 killBackgroundProcesses 、通過(guò)異常并在Application的子類(lèi)中重新注冊(cè)Thread的 Thread.UncaughtExceptionHandler接口+異常方式,等等,都沒(méi)有效果。
最后發(fā)現(xiàn)其實(shí)只要在從一個(gè)activity A 跳到另一個(gè)activity B 時(shí),調(diào)用了A的finish方法,程序就能退出,但這樣不能實(shí)現(xiàn)Back操作了,最后想一個(gè)辦法:我們?yōu)槭裁床蛔约嚎刂瞥绦騽?chuàng)建的activity呢?比如我們可以把程序創(chuàng)建的avtivity放在一個(gè)全局變量里,在退出程序的時(shí)候取出每個(gè)還存在的activity,并對(duì)每個(gè)activity依次調(diào)用finish最后程序就正常退出了。
先做以下幾點(diǎn)說(shuō)明:
(1)我們可以重寫(xiě)一個(gè)Activity管理類(lèi)ActivityManager,里面有一個(gè)堆棧結(jié)構(gòu),用來(lái)存放用戶(hù)顯示的activity,并暴露幾個(gè)方法,一個(gè)向堆棧結(jié)構(gòu)中加入Activity,它主要用來(lái)當(dāng)新建一個(gè)Activity時(shí)加入堆棧,另外一個(gè)從堆棧結(jié)構(gòu)中取出一個(gè)Activity,當(dāng)用戶(hù)調(diào)用Back按鍵時(shí),要從堆棧中刪除無(wú)用的activity,最后定義一個(gè)系統(tǒng)退出時(shí)清空activity方法,并在清空Activity時(shí)調(diào)用每個(gè)Activity的finish方法完成內(nèi)存資源的釋放。
(2)為了共享復(fù)雜的數(shù)據(jù)類(lèi)型,我們可以采用重寫(xiě)Application類(lèi)的方法,在這個(gè)類(lèi)里面定義一個(gè)成員---Activity管理類(lèi)ActivityManager,這樣它就可以被所有的Activity共享了。
(3)在適當(dāng)?shù)臅r(shí)候我們調(diào)用ActivityManager的入堆棧操作和出堆棧操作就行了。比如,在我的需求里,我在onCreate時(shí)調(diào)用入堆棧操作,在用戶(hù)進(jìn)行點(diǎn)擊Back按鍵時(shí)進(jìn)行出堆棧操作。
(4)為了減少代碼的重復(fù)性,我們可以在實(shí)際操作時(shí),自定義一個(gè)Activity基類(lèi),重寫(xiě)里面的onCreate()方法和onBackPressed方法,onCreate方法里我們把當(dāng)前的Activity放入自定義ActivityManager,onBackPressed我們將當(dāng)前Activity從ActivityManager中彈出。
先看ActivityManager類(lèi)主要代碼。
import java.util.Stack;
public class ActivityManager {
private static Stack<Activity> activityStack;
private static ActivityManager instance;
private ActivityManager() {
}
public static ActivityManager getScreenManager() {
if (instance == null) {
instance = new ActivityManager();
}
return instance;
}
//退出棧頂Activity
public void popActivity(Activity activity) {
if (activity != null) {
//在從自定義集合中取出當(dāng)前Activity時(shí),也進(jìn)行了Activity的關(guān)閉操作
activity.finish();
activityStack.remove(activity);
activity = null;
}
}
//獲得當(dāng)前棧頂Activity
public Activity currentActivity() {
Activity activity = null;
if(!activityStack.empty())
activity= activityStack.lastElement();
return activity;
}
//將當(dāng)前Activity推入棧中
public void pushActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
//退出棧中所有Activity
public void popAllActivityExceptOne(Class cls) {
while (true) {
Activity activity = currentActivity();
if (activity == null) {
break;
}
if (activity.getClass().equals(cls)) {
break;
}
popActivity(activity);
}
}
}
再看看自定義的Application類(lèi),有關(guān)網(wǎng)絡(luò)連接處理的代碼可以忽略不管。
public class ApplicationEx extends Application {
private static final String TAG = "ApplicationEx";
private HttpClient httpClient; //采用apache網(wǎng)絡(luò)連接組件
private ActivityManager activityManager = null;
public ApplicationEx() {
}
public ActivityManager getActivityManager() {
return activityManager;
}
public void setActivityManager(ActivityManager activityManager) {
this.activityManager = activityManager;
}
@Override
public void onCreate() {
super.onCreate();
httpClient = createHttpClient();
//初始化自定義Activity管理器
activityManager = ActivityManager.getScreenManager();
}
@Override
public void onLowMemory() {
super.onLowMemory();
shutdownHttpClient();
}
@Override
public void onTerminate() {
super.onTerminate();
shutdownHttpClient();
}
private void shutdownHttpClient() {
if (httpClient != null && httpClient.getConnectionManager() != null) {
httpClient.getConnectionManager().shutdown();
}
}
private HttpClient createHttpClient() {
Log.d(TAG, "createHttpClient()...");
HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
HttpProtocolParams.setUseExpectContinue(params, true);
SchemeRegistry schReg = new SchemeRegistry();
schReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
schReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
//解決多線(xiàn)程訪(fǎng)問(wèn)安全問(wèn)題
ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params, schReg);
return new DefaultHttpClient(connectionManager, params);
}
public HttpClient getHttpClient() {
if (httpClient != null) {
return httpClient;
} else {
return createHttpClient();
}
}
}
再看看我們自定義的一個(gè)Acitivity基類(lèi)。
public abstract class AbstractTemplateActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ApplicationEx application = (ApplicationEx) this.getApplication();
application.getActivityManager().pushActivity(this);
}
@Override
public void onBackPressed() {
super.onBackPressed();
ApplicationEx application = (ApplicationEx) getApplication();
application.getActivityManager().popActivity(this);
}
}
這樣只我們的Activity都繼承AbstractTemplateActivity ,我們就不需要在每個(gè)Activity中寫(xiě) ApplicationEx application = (ApplicationEx) this.getApplication(); application.getActivityManager().pushActivity(this); 等相關(guān)代碼了。
在android 2.1以上的版本都能實(shí)現(xiàn)Activity的完全退出。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android通信方式總結(jié)》、《Android調(diào)試技巧與常見(jiàn)問(wèn)題解決方法匯總》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android使用Theme自定義Activity進(jìn)入退出動(dòng)畫(huà)的方法
- Android仿微信滑動(dòng)退出Activity
- Android 中 退出多個(gè)activity的經(jīng)典方法
- Android一次性退出多個(gè)Activity的方法
- android中實(shí)現(xiàn)完全退出程序方法(退出所有activity)
- Android Activity進(jìn)出動(dòng)畫(huà)三種方法
- Android Activity切換動(dòng)畫(huà)詳解及實(shí)例
- Android Activity跳轉(zhuǎn)動(dòng)畫(huà)效果
- Android實(shí)現(xiàn)Activity界面切換添加動(dòng)畫(huà)特效的方法
- Android的Activity跳轉(zhuǎn)動(dòng)畫(huà)各種效果整理
- Android編程設(shè)定activity進(jìn)入和退出效果的方法
相關(guān)文章
基于fluttertoast實(shí)現(xiàn)封裝彈框提示工具類(lèi)
這篇文章主要為大家介紹了基于fluttertoast實(shí)現(xiàn)封裝彈框提示工具類(lèi)的實(shí)現(xiàn)代碼,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
淺析Android App的相對(duì)布局RelativeLayout
這篇文章主要介紹了Android App的相對(duì)布局RelativeLayout,文中舉了一個(gè)登錄界面的XML布局例子,非常直觀,需要的朋友可以參考下2016-04-04
Android開(kāi)發(fā)之利用jsoup解析HTML頁(yè)面的方法
這篇文章主要介紹了Android開(kāi)發(fā)之利用jsoup解析HTML頁(yè)面的方法,結(jié)合實(shí)例形式分析了Android基于jsoup jar包來(lái)抓取html頁(yè)面的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-03-03
通過(guò)OpenGL ES混合模式縮放視頻緩沖區(qū)來(lái)適應(yīng)顯示尺寸
當(dāng)開(kāi)發(fā)基于軟件模式的游戲時(shí),通過(guò)縮放視頻緩沖區(qū)來(lái)適應(yīng)顯示尺寸是最棘手的問(wèn)題之一;作為開(kāi)發(fā)人員,我們必須嘗試在性能與顯示質(zhì)量之間找到最佳平衡點(diǎn)2012-12-12
Android實(shí)現(xiàn)ListView異步加載的方法(改進(jìn)版)
這篇文章主要介紹了Android實(shí)現(xiàn)ListView異步加載的方法,針對(duì)前面介紹的方法進(jìn)行了線(xiàn)程操作的改進(jìn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08
Android開(kāi)發(fā)之經(jīng)典游戲貪吃蛇
貪吃蛇是一款足夠經(jīng)典的游戲。它的經(jīng)典,在于用戶(hù)操作的簡(jiǎn)單,在于技術(shù)實(shí)現(xiàn)的簡(jiǎn)介,在于他的經(jīng)久不衰。下面來(lái)看下如何在Android開(kāi)發(fā)這款經(jīng)典游戲。2016-07-07
Android調(diào)用系統(tǒng)自帶的分享功能實(shí)例代碼
本篇文章主要介紹了Android調(diào)用系統(tǒng)自帶的分享功能實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04
Android中選項(xiàng)菜單(OptionMenu)的創(chuàng)建方法
這篇文章主要介紹了Android中選項(xiàng)菜單(OptionMenu)的創(chuàng)建方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-01-01

