如何幹淨徹底地退出Android應用程序,是很多開發者的心頭癢。如何幹淨地關閉所有已打開的Activity? 如何關閉指定的Activity? 如何關閉一類Activity? 這裏,我們提出一種通過實現對Application的擴展,實現了一種高效管理Activity,實現Android乾淨徹底地退出應用程序。
首先,我們將管理Activity的功能通過一個擴展的Application類來實現。
//=================================================================================
public class MyApplication extends Application { private static Stack<Activity> activityStack; private static MyApplication singleton; @Override public void onCreate() { super.onCreate(); singleton=this; } // Returns the application instance public static MyApplication getInstance() { return singleton; } /** * add Activity 添加Activity到棧 */ public void addActivity(Activity activity){ if(activityStack ==null){ activityStack =new Stack<Activity>(); } activityStack.add(activity); } /** * get current Activity 獲取當前Activity(棧中最後一個壓入的) */ public Activity currentActivity() { Activity activity = activityStack.lastElement(); return activity; } /** * 結束當前Activity(棧中最後一個壓入的) */ public void finishActivity() { Activity activity = activityStack.lastElement(); finishActivity(activity); } /** * 結束指定的Activity */ public void finishActivity(Activity activity) { if (activity != null) { activityStack.remove(activity); activity.finish(); activity = null; } } /** * 結束指定類名的Activity */ public void finishActivity(Class<?> cls) { for (Activity activity : activityStack) { if (activity.getClass().equals(cls)) { finishActivity(activity); } } } /** * 結束所有Activity */ public void finishAllActivity() { for (int i = 0, size = activityStack.size(); i < size; i++) { if (null != activityStack.get(i)) { activityStack.get(i).finish(); } } activityStack.clear(); } /** * 退出應用程序 */ public void AppExit() { try { finishAllActivity(); } catch (Exception e) { } } }//=================================================================================
注意,爲了在我們自己的應用程序中使用這個自定義的Application類,而不是默認的Application類。需要在Manifest文件中修改一下<Application>的屬性( android:name)
例如:
//=================================================================================1 <application 2 android:icon="@drawable/icon" 3 android:label="@string/app_name" 4 android:name="your_package_name_here.MyApplication">
//=================================================================================
使用方法:
方法1: 之後我們在所有的activity的oncreate方法中通過getinstance得到一個MyApplication的實例,然後調用addActivity方法把當前的activity加入到stack中,如果要退出應用程序只需要調用AppExit方法即可。
方法2: 自定義一個繼承Activity類的BaseActivity
//=================================================================================1 public class BaseActivity extends Activity{ 2 @Override 3 protected void onCreate(Bundle savedInstanceState){ 4 super.onCreate(savedInstanceState); 5 //添加Activity到堆棧 6 MyApplication.getInstance().addActivity(this); 7 } 8 9 @Override 10 protected void onDestroy(){ 11 super.onDestroy(); 12 //結束Activity&從棧中移除該Activity 13 MyApplication.getInstance().finishActivity(this); 14 } 15 16 }//=================================================================================
後續的Activity 都集成這個BaseActivity就可以了。
Android的官方文檔中寫到”沒有必要自定義Application類”
There is normally no need to subclass Application.
但事實上,通過逆向工程國際大廠的Android應用,我發現各廠都自定義了Application類用以實現Global變量操作和Activity管理。所以我們也學習一下吧~(你也有興趣通過逆向工程來借鑑一下別人的Android應用?別急,後續的教程裏會陸續介紹的。)
以上的代碼只是基本的Activity管理方案,以此爲框架,我們可以加入更多關於Acitivity的管理方法以及其他全局變量的操作。