您的位置:首页 > 移动开发 > Android开发

Android完全退出程序

2012-08-31 10:33 295 查看
众所周知 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);
}


然后 在退出的时候调用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 一起聊天打屁 在闲暇时间聊天 在忙碌时间探讨技术
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: