通常关闭一个activity,直接调用finish()方法就行,但是如何安全退出已经调用了多个activity的应用程序呢?
有这么几种方法:
1.记录打开的activity
2.发送特定广播:在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
3.递归退出:在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭
今天我们来主要了解一下第一种方式。那怎样来记录打开的activity呢?
创建一个类MyApplication继承Application,里面创建一个BaseActivity的集合,并提供对该集合的添加 删除 清空的三个方法。
public class MyApplication extends Application {
//用于存放activity的集合
List<BaseActivity> activityList = new ArrayList<>();
//提供一个添加activity的方法
public void addActivity(BaseActivity activity) {
if (!activityList.contains(activity)) {
activityList.add(activity);
}
}
//提供一个移除activity的方法
public void removeActivity(BaseActivity activity) {
if (activityList.contains(activity)) {
activityList.remove(activity);
}
}
//提供一个清空集合的方法
public void clearAllActivity() {
for (int i = 0; i < activityList.size(); i++) {
BaseActivity activity = activityList.get(i);
activity.finish();
}
activityList.clear();
}
}
BaseActivity是Activity的基类,里面写的是所有activity共性的方法和成员变量。
在oncreate()中获取到MyApplication的对象,并调用addActivity()方法
在onDestroy()中移除activity,调用removeActivity()方法
public class BaseActivity extends Activity {
public MyApplication mApplication;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mApplication = (MyApplication) getApplication();
mApplication.addActivity(this);//一旦创建一个activity就加入到activityList集合当中。
}
@Override
protected void onDestroy() {
super.onDestroy();
mApplication.removeActivity(this);//移除activity
}
}
为了用户体验,有的时候用户只是不小心点到了返回键,但是并不想退出应用程序,我们应该给用户“再点击一次返回键就退出应用程序”的友好提示。
我们可以在主页面这样写:
public class MainActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private long mStartTime; //定义一个成员变量,默认初始时间为0
@Override
public void onBackPressed() {
//当点击的时候计算2次点击的时间差,如果在2秒之内点击2次,就退出
long currentTimeMillis = System.currentTimeMillis();
if ((currentTimeMillis - mStartTime) < 2000) {
finish();
} else {
Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
mStartTime = System.currentTimeMillis(); //记录点击后的时间
}
}
}
提供一个小demo:http://download.csdn.net/detail/zsr0526/9770994