Android程序有很多Activity,比如说主窗口A,调用了子窗口B,子窗口B又调用子窗口C,back返回子窗口B后,在B中如何关闭整个Android应用程序呢?这里用到几种方法。

1、finish()方法

finish是Activity的类,仅仅针对Activity,当调用finish()时,只是将活动推向后台,并没有立即释放内存,活动的资源并没有被清理;调用finish()方法会执行Activity.onDestroy()方法,结束Activity生命周期

在开发android应用时,常常通过按返回键(即keyCode ==KeyEvent.KEYCODE_BACK)就能关闭程序,其实大多情况下该应用还在任务里运行着,其实这不是我们想要的结果。

2、Dalvik VM的本地方法
  android.os.Process.killProcess(android.os.Process.myPid()); 获取PID,目前获取自己的也只有该API,否则从/proc中自己的枚举其他进程吧,不过要说明的是,结束其他进程不一定有权限,不然就乱套了。
System.exit(0);  常规java、c#的标准退出法,返回值为0代表正常退出,可以写在onDestory方法中。

我们可以这样做,当用户点击自定义的退出按钮或返回键时(需要捕获动作),我们在onDestroy()里强制退出应用,或直接杀死进程,具体操作代码如下:

//捕获键盘动作

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

//当按下键盘上返回按钮,给出退出对话框

if(keyCode == KeyEvent.KEYCODE_BACK){

new AlertDialog.Builder(this)

.setIcon(R.drawable.services)

.setTitle(R.string.prompt)

.setMessage(R.string.quit_desc)

.setNegativeButton(R.string.cancel, newDialogInterface.OnClickListener() {

@Override

public void onClick(DialogInterface dialog, int which) {

}

})

.setPositiveButton(R.string.confirm, newDialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton){

finish();//

}

}).show();

return true;

}else{

return super.onKeyDown(keyCode, event);

}

}

@Override

protected void onDestroy() {

super.onDestroy();

System.exit(0);//直接结束程序

//或者下面这种方式

//android.os.Process.killProcess(android.os.Process.myPid());

}

3、任务管理器方法
 首先要说明该方法运行在Android 1.5 APILevel为3以上才可以,同时需要权限android.permission.RESTART_PACKAGES,我们直接结束自己的package即可。

直接使用ActivityManager类的restartPackage方法即可,参数为packagename,该类通过getSystemService(Context.ACTIVITY_SERVICE)来实例化ActivityManager对象,这种方法系统提供的,但需要显示声明权限,所以使用中需要综合考虑。

重点说下此种方式:

ActivityManager manager =(ActivityManager)getSystemService(ACTIVITY_SERVICE);
manager.restartPackage(getPackageName());

需要声明权限

这种方法会终止一切和这个程序包关联的,所有共享同一uidprocesskill,所有的activity会被removed

所有创建的服务会停止,还会发一个广播 Intent.ACTION_PACKAGE_RESTARTED导致所有注册alarmsstopped, notifications removed

但是Android2.2中新增了一个API可以帮助我们杀死后台进程(Android2.3再次强调其调用的API Level最小为8)killBackgroundProcessesandroid.app.ActivityManager类的方法,使用时必须在androidmanifest.xml文件中加入KILL_BACKGROUND_PROCESSES这个权限。虽然本类还提供了restartPackage (String packageName) 方法调用的API Level3,但是SDK中已经标记为deprecated,其实他们的原理都是一样的,只不过过去Google的命名方式确实不是很合理,restartPackage的作用很难让我们联想到是结束进程。

该方法的原型:

public void killBackgroundProcesses (StringpackageName) 仅有一个参数为package Name,使用方法比较简单。

ActivityManager am =(ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.killBackgroundProcesses("cn.com.android123.cwj");
// API Level至少为8才能使用
//必须在androidmanifest.xml文件中加入KILL_BACKGROUND_PROCESSES这个权限。

所以要用此方法最好加个判断如果是2.2之前的rom就用restartPackage,之后的就用killBackgroundProcesses。

ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);

if(android.os.Build.VERSION.SDK_INT< 8){
am.restartPackage(getPackageName());

}else{
am.killBackgroundProcesses(getPackageName());

}

参考:

http://dev.10086.cn/cmdn/wiki/index.php?doc-view-6270.html

http://www.cnblogs.com/275095923/archive/2011/09/05/2167958.html

http://hi.baidu.com/jackxiangzi/item/938df16e3aec060fa1cf0fcc

4. 根据Activity的声明周期
  我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。

  在A窗口中使用下面的代码调用B窗口
  Intent intent = new Intent();
  intent.setClass(Android123.this, CWJ.class);
   intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);//注意本行的FLAG设置
  startActivity(intent);

  接下来在B窗口中需要退出时直接使用finish方法即可全部退出。

(若想A调转到B,B再返回A然后应用直接退出的时候B窗口不会在出现,Bactivity可以在intent跳转A的时候加了B.this.finish())

==================================================================================================================================

以上内容来自http://blog.sina.com.cn/s/blog_5da93c8f0101772p.html



更多相关文章

  1. 一款霸榜 GitHub 的开源 Linux 资源监视器!
  2. Android(安卓)Binder实现浅析-Binder驱动
  3. Android广播接收器(三)
  4. Android(安卓)Init进程对信号的处理流程详细介绍
  5. Android有效获取状态栏(StatusBar)高度的方法
  6. Android(安卓)SharedPreferences 首次运行引导界面
  7. 深入讲解Android(安卓)MVP框架,附一个很屌的实现MVP架构的开源库T
  8. android中调用web服务
  9. Android(安卓)中查看内存的使用情况集常用adb命令

随机推荐

  1. Android(安卓)屏幕分辨率适配原理
  2. 重画Progressbar的进度
  3. android中各种height和width总结
  4. android关于AndroidManifest.xml详细分析
  5. Android(安卓)底部弹出Activity
  6. Android(安卓)在部分华为手机上出现乱码
  7. android 8.1Settings添加设置项
  8. android项目集成 flutter
  9. 解决android http请求带中文参数会乱码(u
  10. Android(安卓)修改actionbar标题的颜色和