android程序退出关闭多个activity

在程序的主界面通常都有这样的需求,按一次返回键提示退出,按两次退出程序功能,
如果你的界面里activity个数少时可以直接使用
System.exit(0);
退出程序,但是,当你的activity很多而且有很频繁的交互时就得将你的activity全部finish掉,不然你的程序退出了又会弹出其他activity界面

public class AppManager {
    private static AppManager  instance;
    private static Stack<Activity> activityStack;
    private AppManager(){}

    /*
    懒汉式单例模式
     */
    public static AppManager  getAppManagerInstance(){
        if(instance==null){
            synchronized (Object.class){
                if(instance==null){
                    instance=new AppManager();
                }
            }
        }
        return instance;
    }

    /*
    添加activity到堆栈里
     */
    public void addActivity(Activity  activity){
        if(activityStack==null){
            activityStack=new Stack<>();
        }
        activityStack.add(activity);
    }

    /*
    获取当前Activity(也就是堆栈里的最后一个进入的-----top)
     */
    public Activity  getCurrentActivity(){
        return activityStack.lastElement();
    }

    /*
    结束当前的Activity(堆栈里的Top元素)
     */
    public void finishActivity(){
        Activity activity = activityStack.lastElement();
                finishActivity(activity);
    }

    /*
    结束指定的Activity
     */
    private void finishActivity(Activity activity) {
        if(activity!=null&&!activity.isFinishing()){
            activityStack.remove(activity);
            activity.finish();
            activity=null;
        }
    }

    /*
    结束指定类名的Activity
     */
    public void finishActivity(Class<?>  c){
        for(Activity activity:activityStack){
            if(activity.getClass().equals(c)) {
                finishActivity(activity);
            }
            break;
        }
    }

    /*
    结束所有的Activity
     */

    public void finishAllActivity(){
        for (int i=0;i< activityStack.size();i++){
            if(null!=activityStack.get(i)){
                //finishActivity方法中的activity.isFinishing()方法会导致某些activity无法销毁
                //貌似跳转的时候最后一个activity 是finishing状态,所以没有执行
                //内部实现不是很清楚,但是实测结果如此,使用下面代码则没有问题
                // find by TopJohn
                //finishActivity(activityStack.get(i));

                activityStack.get(i).finish();
            }
        }
        activityStack.clear();
    }

    /*
    获取指定的activity
     */
    public Activity getAcivity(Class<?>  c){
        if(activityStack!=null){
            for(Activity  activity:activityStack){
                if(activity.getClass().equals(c)){
                    return activity;
                }
            }
        }
        return null;
    }

  /*
  退出应用程序
   */
    public void AppExit(Context context){
        try {
            finishAllActivity();
            //杀死该应用程序
            android.os.Process.killProcess(Process.myPid());
            System.exit(0);
        }catch (Exception e){
            e.getMessage();
        }
    }
}

我们首先得将我们的activity添加我们的堆栈里面,在我们的activity的基类(BaseActivity)里进行添加

public class BaseActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


       AppManager.getAppManagerInstance().addActivity(this);
    }
    }

然后让我们的其他Activity继承我们的基类

public class HomeActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.homeactivity_main);

    }


    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch (keyCode) {
            case KeyEvent.KEYCODE_BACK:
                Timer timer = new Timer();
                if (!flag) {
                    showToast("再按一次返回键退出程序");
                    flag = true;
                    timer.schedule(new TimerTask() {
                        @Override
                        public void run() {
                            flag = false;
                        }
                    }, 2000);
                } else {
                    flag = false;
                    AppManager.getAppManagerInstance().finishAllActivity();
                }
                break;
            case KeyEvent.KEYCODE_HOME:
                AppManager.getAppManagerInstance().finishAllActivity();
                break;
        }
        return true;
    }

}

这样就能安全的退出而不会出现退出程序还会弹出界面的问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值