众所周知 android程序如果正常退出 会在后台继续运行
这个android的activity栈有关系 他不显示 并不代表结束
现在基本都是在做2.3以上的开发 所以 用系统的杀死当前包中activity的方式不行了
现在为大家推荐几种全局退出方法 亲测可行 都是在开发中用到过的
一、记录打开过的activity,然后在退出的时候 遍历数组 关闭
public class ExitUtil {
//定义一个activity列表
private List<Activity> mList = new ArrayList<Activity>();
//顶一一个类的实例
private static ExitUtil instance;
//私有构造方法 不允许创建类的实例
private ExitUtil() {
}
/**
* 单例模式
* @return
*/
public static ExitUtilgetInstance() {
if (null == instance) {
instance = new ExitUtil();
}
return instance;
}
/**
* 如果activity已经 destory了 就移除
* @param activity
*/
public void remove(Activity activity){
mList.remove(activity);
}
/**
* 添加ativity
* @param activity
*/
public void addActivity(Activity activity) {
mList.add(activity);
}
/**
* 遍历 结束activity 并且退出
*/
public void exit() {
try {
for (Activity activity : mList) {
if (activity != null)
activity.finish();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
}
}
一般推荐在写程序的时候,自己顶一个commonactivity 继承activity 作为自己activity的父类
这样比较方便 你可以在自己的commonactivity中调用一下退出类的添加和移除方法 比较方便
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
ExitUtil.getInstance().addActivity(this);
super.onCreate(savedInstanceState);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
ExitUtil.getInstance().remove(this);
}
这样 在退出的界面中 调用下exit方法就可以了
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// 按下键盘上返回按钮
if (keyCode == KeyEvent.KEYCODE_BACK) {
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("确认退出")
.setNegativeButton("取消",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
}
})
.setPositiveButton("确定",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int whichButton) {
// closed();
ExitUtil.getInstance().exit();
}
}).show();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
这样 就可以成功的退出
二、广泛采用的 采用广播退出的方法
也是在自己定义的commoactivity中 注册个广播 如果接到广播 结束activity
public BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
finish();
}
};
这个需要在onresume中注册广播 这里的GlobalVarable.EXIT_ACTION是自己定义的一个action
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
IntentFilter filter = new IntentFilter();
filter.addAction(GlobalVarable.EXIT_ACTION);
this.registerReceiver(this.broadcastReceiver, filter);
}
需要注意的是 要在ondestory中解除注册 否则会报异常
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
this.unregisterReceiver(broadcastReceiver);
}
private void closed(){
Intent intent = new Intent();
intent.setAction(GlobalVarable.EXIT_ACTION); // 退出动作
this.sendBroadcast(intent);// 发送广播
super.finish();
//退出后台线程,以及销毁静态变量
System.exit(0);
}
三、定义一个 MyApplication extends Application 在MyApplication中定义一个全局变量
private boolean isExit = false;
public boolean isExit() {
return isExit;
}
public void setExit(boolean isExit) {
this.isExit = isExit;
并且在commonactivity中的onsatrt方法中判断 如果为true就关闭当前activity
@Override
protected void onStart() {
// TODO Auto-generated method stub
MyApplication application = (MyApplication) this.getApplication();
if(application.isExit()==true){
this.finish();
}
super.onStart();
}
如果需要退出 则在当前界面中将isExit设为True并且结束当前activity 就可以退出所以activity
值得注意的是 如果想要MyApplication起作用 需要在配置文件中的Application设置成自己的MyApplication
因为系统默认的是Application
如果不懂 欢迎留言咨询
欢迎加群:169146045 一起聊天打屁 在闲暇时间聊天 在忙碌时间探讨技术