Android中退出多个Activity的两个经典方法
这里介绍两种方法:一种把每个activity记住,然后逐一干掉;另一种思路是使用广播。
方法一、用list保存activity实例,然后逐一干掉
上代码:
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方法中添加类似代码: [java] 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方法 附:此方法也可参考链接:http://maosidiaoxian.iteye.com/blog/1404725
方法二、使用广播
//2.2退出整个应用难免让人困扰,曾经一度的尝试一下方式: ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); manager.killBackgroundProcesses(package); //不行 android.os.Process.killProcess(android.os.Process.myPid()); // 也不行 manager.restartPackage(package); // 还是不行 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(); } ... } 别人写的缺了个地方(unregisterReceiver)这个必须要加,不然会出一堆错,找了个最简单的方法。
本文学习时候收集于网络,只是不知道了源地址,感谢作者提供,还往作者见谅,大家一起学习!
如果,这篇博客帮您解决了问题,不妨点击一下右下角的【推荐】。如果,您希望更容易地发现我的新博客,不妨点击一下【加关注】。因为,我的热情需要您的肯定和支持!感谢您的阅读,如果文章中有错误或者您有什么好的建议,也欢迎您直接留言批评指教。Thanks,friends! |