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)这个必须要加,不然会出一堆错,找了个最简单的方法。



方法三、

Intent intent = new Intent(User_Login.this,Main.class);

//删掉之前所有的Activity,包括登录Activity intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值