Android完全退出程序

时间:2022-02-20 20:33:40

众所周知  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 BroadcastReceiverbroadcastReceiver = 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);
}


 

然后 在退出的时候调用close方法发送广播
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  一起聊天打屁  在闲暇时间聊天  在忙碌时间探讨技术