退出方法:
  1) 使用singleTask加载模式
  2) 定义一个基类,做公共的功能
     定义一个Application

退出形式:
  1) 菜单->退出
  2) 按back键,提示再按一次退出
  3) 按back,弹出退出提示对话框
  4) 按back直接退出


以下是第一种方法,通过在清单中配置activity的加载模式singleTask

使用singletask 栈中单实例 例子:a启动b,b启动c,在c的menu菜单中点击退出项,关闭所有activity。

在a的清单配置中添加加载模式为singletask,c的menu菜单的点击事件是启动a。在a中重写方法onNewIntent(),里面关闭a页面,并且结束进程。
@Override
protected void onNewIntent(Intent intent)
{
    //加载了singletask后,返回来的时候直接进入onNewIntent()方法,不会再进入onCreate();
    super.onNewIntent(intent);
    finish();
    Process.killProcess(Process.myPid());//所有activity关闭后,结束进程
}

第二种方法

在application里面创建一个全局容器arraylist<activity>,写两个方法,在容器里加addActivity()和finishActivity();

public class Myapplication extends Application
{
    public static ArrayList<Activity> activities = new ArrayList<Activity>();
    public static void addActivity(Activity activity)
    {
        activities.add(activity);
    }
    public static void finishActivity()
    {
        for (int i = 0; i < activities.size(); i++)
        {
            activities.get(i).finish();
        }
        Process.killProcess(Process.myPid());//所有activity关闭后,结束进程
    }
}


创建一个基类BaseActivity,写方法getApplication(),(作用是减少代码重复)让每一个activity都继承它。

public class BaseActivity extends Activity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
        Myapplication app = (Myapplication) getApplication();
        app.addActivity(this);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.base, menu);
        return true;
    }
}

退出形式的代码如下:

1、

@Override
public boolean onOptionsItemSelected(MenuItem item)
{
    Myapplication app = (Myapplication) getApplication();
    app.finishActivity();//第一种形式:点击菜单退出项,关闭所有    activity,结束进程
    return super.onOptionsItemSelected(item);
}

2、

int pressbacktimes = 0;
    private Button button;
    @Override
        public void onBackPressed()
        {
            pressbacktimes ++;
            if(pressbacktimes == 1)
            {
                Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
                button.postDelayed(new Runnable()
                {
                    //第二种形式:两次点击返回键,第一次弹出toast,提示再按一次退出。间隔超过5秒,就失效
                    @Override
                    public void run()
                    {
                        pressbacktimes = 0;
                    }
                }, 5000);
            }
            else if(pressbacktimes == 2)
            {
                Myapplication app = (Myapplication) getApplication();
                app.finishActivity();//点击菜单退出项,关闭所有activity,结束进程
            }
        }

3、

@Override
public void onBackPressed()
{
    //第三种形式:MainActivity里面点击返回键,弹出对话框,是否退出
    new AlertDialog.Builder(this).setTitle("title").setMessage("是否退出").setNegativeButton("取消", null).setPositiveButton("确定", new     DialogInterface.OnClickListener()
    {
        @Override
        public void onClick(DialogInterface dialog, int which)
        {
            Myapplication app = (Myapplication) getApplication();
                app.finishActivity();
        }
    }).create().show();
}