編輯:關於Android編程
本文實例講述了退出Android程序時清除所有activity的方法。分享給大家供大家參考,具體如下:
在一個項目中,要退出android程序,試了restartPackage、 killBackgroundProcesses 、通過異常並在Application的子類中重新注冊Thread的 Thread.UncaughtExceptionHandler接口+異常方式,等等,都沒有效果。
最後發現其實只要在從一個activity A 跳到另一個activity B 時,調用了A的finish方法,程序就能退出,但這樣不能實現Back操作了,最後想一個辦法:我們為什麼不自己控制程序創建的activity呢?比如我們可以把程序創建的avtivity放在一個全局變量裡,在退出程序的時候取出每個還存在的activity,並對每個activity依次調用finish最後程序就正常退出了。
先做以下幾點說明:
(1)我們可以重寫一個Activity管理類ActivityManager,裡面有一個堆棧結構,用來存放用戶顯示的activity,並暴露幾個方法,一個向堆棧結構中加入Activity,它主要用來當新建一個Activity時加入堆棧,另外一個從堆棧結構中取出一個Activity,當用戶調用Back按鍵時,要從堆棧中刪除無用的activity,最後定義一個系統退出時清空activity方法,並在清空Activity時調用每個Activity的finish方法完成內存資源的釋放。
(2)為了共享復雜的數據類型,我們可以采用重寫Application類的方法,在這個類裡面定義一個成員---Activity管理類ActivityManager,這樣它就可以被所有的Activity共享了。
(3)在適當的時候我們調用ActivityManager的入堆棧操作和出堆棧操作就行了。比如,在我的需求裡,我在onCreate時調用入堆棧操作,在用戶進行點擊Back按鍵時進行出堆棧操作。
(4)為了減少代碼的重復性,我們可以在實際操作時,自定義一個Activity基類,重寫裡面的onCreate()方法和onBackPressed方法,onCreate方法裡我們把當前的Activity放入自定義ActivityManager,onBackPressed我們將當前Activity從ActivityManager中彈出。
先看ActivityManager類主要代碼。
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) {
//在從自定義集合中取出當前Activity時,也進行了Activity的關閉操作
activity.finish();
activityStack.remove(activity);
activity = null;
}
}
//獲得當前棧頂Activity
public Activity currentActivity() {
Activity activity = null;
if(!activityStack.empty())
activity= activityStack.lastElement();
return activity;
}
//將當前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類,有關網絡連接處理的代碼可以忽略不管。
public class ApplicationEx extends Application {
private static final String TAG = "ApplicationEx";
private HttpClient httpClient; //采用apache網絡連接組件
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));
//解決多線程訪問安全問題
ClientConnectionManager connectionManager = new ThreadSafeClientConnManager(params, schReg);
return new DefaultHttpClient(connectionManager, params);
}
public HttpClient getHttpClient() {
if (httpClient != null) {
return httpClient;
} else {
return createHttpClient();
}
}
}
再看看我們自定義的一個Acitivity基類。
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 ,我們就不需要在每個Activity中寫 ApplicationEx application = (ApplicationEx) this.getApplication(); application.getActivityManager().pushActivity(this); 等相關代碼了。
在android 2.1以上的版本都能實現Activity的完全退出。
更多關於Android相關內容感興趣的讀者可查看本站專題:《Android通信方式總結》、《Android調試技巧與常見問題解決方法匯總》、《Android開發入門與進階教程》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結》、《Android視圖View技巧總結》、《Android布局layout技巧總結》及《Android控件用法總結》
希望本文所述對大家Android程序設計有所幫助。
Android UI視圖效果篇之仿QQ好友列表分組懸浮PinnedHeaderExpandableListView
樓主是在平板上測試的,圖片稍微有點大,大家看看效果就好 接下來貼源碼: PinnedHeaderExpandableList
RecyclerView 添加head view頭部 和foot view尾部、設置水平horizontal時左側布局和右側布局
折騰一下午,遇到若干問題:如,設置水平HORIZONTAL時,占用多個跨度(類似單元格的合並)終於都好用了。。。簡陋圖發6張。LinearLayoutManager.VE
Android平台搖搖切歌功能
前些天印尼客戶要求在高通平台7251上加一個搖搖切歌功能。查了些資料,基本實現了此功能。 直接上源碼,用svn查看修改點。 前面兩個ic_mp_sha
常用Android代碼
這裡收集了大家常用的一些Android代碼,持續更新中,內容來自自己的平時積累和網絡上看到的文章。如有錯誤歡迎指正裡面可能會有重復內容,請忽略或者提醒我刪除。setBac