//完全退出
//((ActivityManager)getSystemService(Context.ACTIVITY_SERVICE)).restartPackage(getPackageName()); 
//finish();
//android.os.Process.killProcess(android.os.Process.myPid());
//System.exit(0);
ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); 
am.killBackgroundProcesses(getPackageName()); finish和杀进程都只是把当前activity干掉。如果我从A->B->C->D,这时我需要从D直接退出程序。网上查询相关资料
2.1之前版本采用第一个方法需要加入权限<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
这几天刷了2.2的rom发现restartPackage方法无效,网上搜了下答案:
在Android 2.2中新增了一个API可以帮助我们杀死后台进程,不过Android123再次强调其调用的API Level最小为8,killBackgroundProcesses是android.app.ActivityManager类的方法,使用时必须在androidmanifest.xml文件中加入KILL_BACKGROUND_PROCESSES这个权限。虽然本类还提供了restartPackage (String packageName) 方法调用的API Level为3,但是SDK中已经标记为deprecated,其实他们的原理都是一样的,只不过过去Google的命名方式确实不是很合理,restartPackage的作用很难让我们联想到是结束进程。最后一个方法需要加入权限<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES">但是现在的问题是按照这种方法还是退不出!!!请教谁做过的,帮忙解决下。万分感激 

解决方案 »

  1.   

    尝试一下android.os.Process类中的方法:int id = Process.myPid();
    Process.killProcess(id);
      

  2.   


    这个方法还仅仅是把当前的activity进程杀掉,现在如果我A->B->C,现在我想从C直接退出应用程序,在C中用int id = Process.myPid();
    Process.killProcess(id);仅仅是把C的进程杀了,程序不能完全退出
      

  3.   

    这个应该就是干掉了本程序进程啊,怎么会只是干掉了当前Activity呢。楼主你有测试过吗
      

  4.   

    不管用,
    A->B
    B中执行android.os.Process.killProcess(android.os.Process.myPid());
        结果是结束了B,然后黑屏一秒,然后重新启动A。
    B中执行android.os.Process.killProcess(getTaskId());
        结果是结束了B,未经黑屏,没有android的过渡效果,直接回到A的原状态,A没有重新启动。
    B中执行finish(RESULT_OK);
        结果是结束了B,经过android过渡效果回到A的原状态,A没有重新启动。这些现象和这几个函数的功能说明不一致啊,现在怀疑android的SDK到底完善没有
      

  5.   

    A->B->C->D每次启一个activity时调用this.finish(),如果你有很多Activity,这样做的对内存是很好的
    这是我们常做的,也是比较好的做法。
    在某一个activity根据需要在用startActivity(intent)
      

  6.   

    帮楼主在eoeandroid上找了一个
    可以看看很多网友可能发现自己的Android程序有很多Activity,比如说主窗口A,调用了子窗口B,在B中如何关闭整个Android应用程序呢?  首先要说明在B中直接使用finish(),接下来手机显示的还是主窗口A,所以一起来看看是如何实现的吧.  1. Dalvik VM的本地方法  android.os.Process.killProcess(android.os.Process.myPid())    //获取PID,目前获取自己的也只有该API,否则从/proc中自己的枚举其他进程吧,不过要说明的是,结束其他进程不一定有权限,不然就乱套了。
      System.exit(0);   //常规java、c#的标准退出法,返回值为0代表正常退出2. 任务管理器方法   首先要说明该方法运行在Android 1.5 API Level为3以上才可以,同时需要权限android.permission.RESTART_PACKAGES,我们直接结束自己的package即可,直接使用ActivityManager类的restartPackage方法即可,参数为package name,该类通过getSystemService(Context.ACTIVITY_SERVICE)来实例化ActivityManager对象,这种方法系统提供的,但需要显示声明权限,所以使用中需要综合考虑。3. 根据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方法即可全部退出。
      

  7.   

    算了,你们被找了,上面的都是转载 Android123的,给你们6种方法吧,绝对能解决 Android应用完全退出方法终极篇
      

  8.   

    有Force Close的对话框怎么办,其实我们通过重写Android应用程序的Application基类自己实现 Thread.UncaughtExceptionHandler接口的uncaughtException方法是可以避免出现FC窗口的,用户感觉直接退出了一样。这个怎么做?有人解决了吗?
      

  9.   

    问下,这帖子啥时候结了,csdn的android分区的楼主都很忙嘛
      

  10.   

    要完全退出一个程序,用restartPackage(),killProcess()都达不到效果,android不像iPhone,有一个home键,按一下,就退出了程序。特别是killProcess()用这个的时候,屏幕会顿一下,感觉非常不好。
    我自己用到过的完全退出整个程序的方法。1.自己写一个Activitiy的管理类,最简单的是用一个List来保持,每开启一个activity,就将其加到List里。当你想完全退出程序时,你将List里的每个Activity都finish()掉就可以了。  不过个人不太喜欢使用这种方法。
    2.在你的每个Activity里,注册一个特定的Broadcast,当你想退出程序时,就send一个特定的Broadcast,这样所有还没有finish的activity都可以接收到这个broadcast,接收到broadcast后,就finish掉Activity。这样该程序的所有Activity就finish了,也就达到了退出程序的效果。如果Activity很少么,建议不要这样使用,如果很多的话,推荐使用第2种方法。foresquare for android就使用过第2种方法。
      

  11.   


    用第二个方法现在有一个问题,我的程序完全退出不能是finish()方式,要把进程杀了,怎么解决?
      

  12.   

    有没有人来个结贴的,看完了也不知道到底用什么方法可以完全退出所有的activity?
      

  13.   

    用介个,介个                         Intent startMain = new Intent(Intent.ACTION_MAIN);
             startMain.addCategory(Intent.CATEGORY_HOME);
             startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
             startActivity(startMain);
             System.exit(0);
      

  14.   

    要想杀死2.2以上的进程,必须先要把所有的activity先finish()掉才可以,如果你只有一个activity再调用Process.killProcess(id)就可以了。所以:
    public class MyActivity extends Activity
    {
        public static List<Activity> activityList = new ArrayList<Activity>();    @Override
        protected void onCreate(Bundle savedInstanceState)
        {        super.onCreate(savedInstanceState);
            activity.add(this);
        }    @Override
        protected void onDestroy()
        {        super.onDestroy();
            activity.remove(this);    }
        public static void killMyProcess()
        {        for (Activity activity : activity)
            {
                activity .finish();
            }
            android.os.Process.killProcess(android.os.Process.myPid());    }
    }
    所有activity继承它然后调用killMyProcess()搞定
      

  15.   

    只要在调用下一个activity的语句之后,加上一个finish()即可,
     startActivity(intent);
     finish(); 
    代码大致如上,已经测试过了,完全成功。
      

  16.   

    当然,最后一个activity,直接调用System.exit(0);
      

  17.   


    @Override
    public void onBackPressed() {
    new AlertDialog.Builder(this).setTitle("Are you sure to exit?")
    .setPositiveButton(android.R.string.ok, new OnClickListener() {
    @Override
    public void onClick(DialogInterface paramDialogInterface, int paramInt) {
    try {
    finish();
    } catch (Exception e) {
    }
    finally{
    System.exit(0);
    }
    }
    }).setNegativeButton(android.R.string.cancel, null).show();
    }
    @Override
    protected void onDestroy() {
    System.exit(0);
    }
      

  18.   

    测试过不只是activity多的问题,包括SERVICE(其他两种组件未测试过)。只要没有调用他们的相关的完成和结束方法,就算使用,android.os.Process.killProcess,或者发生异常,结束了当前的主线程和进程,android会马上再建一个新的进程和线程来继续那些没有结束的组件。
    这会造成一系统问题,比如该初始化的内存没有初始化,程序起动时设置的某些信息不存在了。因此我想到的是自已写一个退出方法,包掉所有未结束的组件,然后退出。类似
    public static void exitSystem(Activity activity) {
    List<Activity> list = Messager.getActivities();
    for (int i = 0; i < list.size(); i++) {
    Activity ac = list.get(i);
    if (ac != null)
    ac.finish();
    list.remove(i);
    }
    stopKryoLookService(activity);
    killAllConnections(activity);
    Intent startMain = new Intent(Intent.ACTION_MAIN);
    startMain.addCategory(Intent.CATEGORY_HOME);
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    activity.startActivity(startMain);
    System.exit(0);
    }
    另外要考虑程序异常退出时,利用Thread.UncaughtExceptionHandler,来调用上面的方法!!
      

  19.   

    可以通过framework的方法去发射去关闭比较简单
    具体代码:
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    try {
    Method forceStopPackage = ActivityManager.class.getDeclaredMethod( "forceStopPackage", String.class);
    forceStopPackage.setAccessible(true);
    forceStopPackage.invoke(am, packageName);
    } catch (Exception e) {
    Util.Log("stop", "stop error " + packageName);
    e.printStackTrace();
    }
      

  20.   

    这个提醒了我,调用finish()之后就OK了