一、經過廣播html
相信有過項目經驗的同窗都遇到過這樣的問題,就是設計「退出」功能時可能會遇到有些界面不能關閉的問題。固然若是你的項目全部的界面都在打開另外一個界面時被關閉就不存在這個問題了,但大多數狀況下這樣是很不合理的,由於每次要查看這個界面都須要從新加載數據。尤爲對於須要走網絡的數據顯示,這不只效率低並且成本高。android
網上大概有如下幾種方法解決這個問題:網絡
(1) System.exit(0); (2) Process.killProcess(Process.myPid()); (3) ActivityManager activityManager = (ActivityManager) this .getSystemService(Context.ACTIVITY_SERVICE); activityManager.restartPackage("packagename");
但這些貌似不是萬能的,有的說在2.2版本後就失效了,那咱們怎麼辦呢?在起初的一個項目裏我用了一個比較笨的方法,我用一個類來專門管理全部的Activity。這個類裏有一個List,每打開一個Activity我就把這個Activity放到這個List中,當退出時再將List中全部的Activity一個一個的關閉。ide
在後來的項目中發現了一個更好地方法,就是經過廣播來完成退出功能,具體實現過程是這樣的:在每一個Activity建立時(onCreate時)給Activity註冊一個廣播接收器,當退出時發送該廣播便可。大概的代碼以下:this
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); IntentFilter filter = new IntentFilter(); filter.addAction("finish"); registerReceiver(mFinishReceiver, filter); …… } private BroadcastReceiver mFinishReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if("finish".equals(intent.getAction())) { Log.e("#########", "I am " + getLocalClassName() + ",now finishing myself..."); finish(); } } };
相信聰明的你們會把上面的代碼寫在一個基類裏面,由於若是你的項目中Activity不少的話,寫起來很麻煩,並且也不符合代碼規範。spa
在退出時執行如下代碼便可關閉全部界面徹底退出程序:設計
getApplicationContext().sendBroadcast(new Intent("finish"));rest
轉載:http://www.cnblogs.com/wader2011/archive/2011/10/10/2205161.html代碼規範
二、使用退出類code
public class CloseActivity { private static LinkedList<Activity> acys = new LinkedList<Activity>(); public static Activity curActivity; public static void add(Activity acy) { acys.add(acy); } public static void remove(Activity acy) { acys.remove(acy); } public static void close() { Activity acy; while (acys.size() != 0) { acy = acys.poll(); if (!acy.isFinishing()) { acy.finish(); } } // android.os.Process.killProcess(android.os.Process.myPid()); } }
三、
咱們知道Android的窗口類提供了歷史棧,咱們能夠經過stack的原理來巧妙的實現,這裏咱們在D窗口打開A窗口時在Intent中直接加入標誌Intent.FLAG_ACTIVITY_CLEAR_TOP,再次開啓A時將會清除該進程空間的全部Activity。 在D中使用下面的代碼: Intent intent = new Intent(); intent.setClass(D.this, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); //注意本行的FLAG設置 startActivity(intent); finish();關掉本身 在A中加入代碼: Override
protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub
super.onNewIntent(intent);
//退出
if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {
finish();
}
}
A的Manifest.xml配置成android:launchMode="singleTop"
原理總結: 通常A是程序的入口點,從D起一個A的activity,加入標識Intent.FLAG_ACTIVITY_CLEAR_TOP這個過程當中會把棧中B,C,都清理掉。由於A是android:launchMode="singleTop" 不會調用oncreate(),而是響應onNewIntent()這時候判斷Intent.FLAG_ACTIVITY_CLEAR_TOP,而後把A finish()掉。 棧中A,B,C,D所有被清理。因此整個程序退出了。