双击返回结束
public long keybackTime = 0;
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (Math.abs(System.currentTimeMillis() - keybackTime) > 2000) {
keybackTime = System.currentTimeMillis();
Toast.makeText(getBaseContext(), "再按一次返回键退出程序", Toast.LENGTH_SHORT).show();
} else {
finish();
}
} else if (event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
return false;
}
return true;
}
当需要退出所有 Activity 时:
Android退出所有Activity最优雅的方式
转载 2016年01月14日 14:31:00
关于退出所有Activity,目前网上比较流行的方式大概有以下几种:
① 使用ActivityManager的方式;
② 自定义一个Activity集合类的方式;
③ 通过发送广播的方式;
④ 通过杀死当前应用进程的方式;
以上方式的具体实现大家可自行谷歌百度,此处不再赘述。
但是这些方式要么不太靠谱,要么有限制,要么不够优雅。今天我们就来说一个简单有效,优雅大方的方式来退出所有的Activity。
原理
先来说一下原理。我们知道,Activity有四种启动模式,分别为:standard(默认模式)、singleTop、singleTask、singleInstance。本方式需要使用的就是singleTask启动模式。
如果设置一个Activity的启动模式为singleTask,那么每次启动此Activity时系统都会检查当前任务栈中是否已经存在此Activity的实例。如果已经存在,则不再创建此Activity新的实例,而是调用已存在的Activity的onNewIntent()方法,并把intent作为此方法的参数传递给它。然后它就会被置于栈顶,并把它之前的所有的Activity移除掉。
原理实现
(我们先将进入应用的第一个Activity称为BaseActivity)。明白了基本原理之后就好办了,先将BaseActivity的启动模式设置为singleTask,并重写此Activity的onNewIntent()方法用来结束自己,之后会在此Activity上进入其他Activity进行数量不定的跳转。在需要退出时只需在当前Activity上调用startActivity(this,BaseActivity.class)会首先将除BaseActivity外的所有Activity结束掉,然后会自动调用BaseActivity的onNewIntent()结束掉自己,这样所有Activity都完美的退出了。
图解实现
为了便于理解,使用下图演示此方式的具体实现过程。
代码实现
第一步:在 AndroidManifest 中设置BaseActivity的启动模式为singleTask
android:launchMode="singleTask"
<application
...
<activity
android:name=".activity.BaseActivity"
android:launchMode="singleTask"
/>
...
</application>
第二步:重写BaseActivity的onNewIntent()方法
//声明一个静态常量,用作退出BaseActivity的Tag
public static final String EXIST = "exist";
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
if (intent != null) {//判断其他Activity启动本Activity时传递来的intent是否为空
//获取intent中对应Tag的布尔值
boolean isExist = intent.getBooleanExtra(EXIST, false);
//如果为真则退出本Activity
if (isExist) {
this.finish();
}
}
}
第三步:在需要退出应用的Activity中启动BaseActivity
Intent intent = new Intent(this,BaseActivity.class);
//传递退出所有Activity的Tag对应的布尔值为true
intent.putExtra(BaseActivity.EXIST, true);
//启动BaseActivity
startActivity(intent);
(这个管理类暂时没发现用处,如果没有也可以实现退出)由于Activity都会放入到栈中管理,那我们可以仿照这个定义一个类似的Activity栈,每个打开一个Activity,就把它放入到我们自定义的Activity中,因此我们写一个Activity管理类来管理这些Activity,代码如下:
/**
* APP管理类
*
*/
public class AppManager {
private static Stack<Activity> activityStack;
private static AppManager instance;
private PendingIntent restartIntent;
private AppManager() {
}
/**
* 单一实例
*/
public static AppManager getAppManager() {
if (instance == null) {
instance = new AppManager();
}
return instance;
}
/**
* 添加Activity到堆栈
*/
public void addActivity(Activity activity) {
if (activityStack == null) {
activityStack = new Stack<Activity>();
}
activityStack.add(activity);
}
/**
* 获取当前Activity(堆栈中最后一个压入的)
*/
public Activity currentActivity() {
Activity activity = activityStack.lastElement();
return activity;
}
/**
* 结束当前Activity(堆栈中最后一个压入的)
*/
public void finishActivity() {
Activity activity = activityStack.lastElement();
finishActivity(activity);
}
/**
* 结束指定的Activity
*/
public void finishActivity(Activity activity) {
if (activity != null) {
activityStack.remove(activity);
activity.finish();
activity = null;
}
}
/**
* 结束指定类名的Activity
*/
public void finishActivity(Class<?> cls) {
for (Activity activity : activityStack) {
if (activity.getClass().equals(cls)) {
finishActivity(activity);
}
}
}
/**
* 结束所有Activity
*/
public void finishAllActivity() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (null != activityStack.get(i)) {
activityStack.get(i).finish();
}
}
activityStack.clear();
}
/**
* 退出应用程序
*/
public void exitApp(Context context) {
try {
finishAllActivity();
System.exit(0);
android.os.Process.killProcess(android.os.Process.myPid());
} catch (Exception e) {
}
}
}