android sdk 退出機制的研究 有多種,java
方法1、用list保存activity實例,而後逐一干掉android
上代碼:app
import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.app.AlertDialog; import android.app.Application; import android.content.DialogInterface; import android.content.Intent; public class SysApplication extends Application { private List<Activity> mList = new LinkedList<Activity>(); private static SysApplication instance; private SysApplication() { } public synchronized static SysApplication getInstance() { if (null == instance) { instance = new SysApplication(); } return instance; } // add Activity public void addActivity(Activity activity) { mList.add(activity); } public void exit() { try { for (Activity activity : mList) { if (activity != null) activity.finish(); } } catch (Exception e) { e.printStackTrace(); } finally { System.exit(0); } } @Override public void onLowMemory() { super.onLowMemory(); System.gc(); } }
在每一個Activity的onCreate方法中添加相似代碼:ide
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SysApplication.getInstance().addActivity(this); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SysApplication.getInstance().addActivity(this); }
在須要退出程序的時候,調用:函數
SysApplication.getInstance().exit();
SysApplication.getInstance().exit();
簡而言之,經過單例模式把每一個Activity 的引用添加到一個全局鏈表中,每次退出程序調用System.exit(0)時,先調用鏈表中Activity 的finish方法this
方法2、使用廣播spa
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); manager.killBackgroundProcesses(package);
不行rest
android.os.Process.killProcess(android.os.Process.myPid());
也不行code
manager.restartPackage(package);
仍是不行blog
Intent MyIntent = new Intent(Intent.ACTION_MAIN); MyIntent.addCategory(Intent.CATEGORY_HOME); startActivity(MyIntent); finish();
這個只是退回到桌面,若是打開多個Activity關閉從新打開也會有問題,仍是仍是不行
看到有說廣播機制,發現是個好東東,能完全解決這個問題,廢話不說看代碼:
public abstract class EnterActivity extends BaseActivity { ... // 寫一個廣播的內部類,當收到動做時,結束activity private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { unregisterReceiver(this); // 這句話必需要寫要不會報錯,不寫雖然能關閉,會報一堆錯 ((Activity) context).finish(); } }; @Override public void onResume() { super.onResume(); // 在當前的activity中註冊廣播 IntentFilter filter = new IntentFilter(); filter.addAction(Attribute.PAGENAME); registerReceiver(this.broadcastReceiver, filter); // 註冊 } /** * 關閉 */ public void close() { Intent intent = new Intent(); intent.setAction(Attribute.PAGENAME); // 說明動做 sendBroadcast(intent);// 該函數用於發送廣播 finish(); } ... }
這就是 我對android中的activity的退出機制的總結.
在之後的教程中,咱們將一步步實現這樣的效果.