前面我们来先看一下目前网上提供的几种方案:
1.退出单个activity
1)、获取当前进程的id,杀死该进程。
android
.os.Process.killProcess(android.os.Process.myPid())
2)、终止当前正在运行的Java虚拟机方法。System.exit(0);
3)、finish();
4)、杀包方式。
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
manager.restartPackage(getPackageName());
添加权限:<uses-permission android:name="android.permission.RESTART_PACKAGES" />;
(在2.2之前可以利用这个退出应用,很遗憾android2.2后失效了,连单个activity都结束不了)
2.退出整个应用(多个Activity)
以下我直接列出网上给出的几种方案,就不做详细说明了。
1)、制造抛异常导致程序强制退出:
2)、用个容器记录每个打开的Activity,在需要退出的时逐一关闭每个Activity
3)、广播方式:
4)、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
3.接下来看一下怎么利用activity启动模式退出整个应用,在这之前我简单的说下activity四种模式的概念,因为这个退出方法跟 activity的启动模式有一定的关系;
1)、standard 模式;也就是默认模式,每次激活Activity时都会创建一个Activity实例,并放入任务栈中。
2)、singleTop 模式;如果在任务栈中的栈定存在该Activity实例,下次激活该Activity实例时就不会创建新的 Activity的实例,直接重用它(
在重用的这个过程中会调用实例的OnNewIntent()这个方法
),否则就创建新的Activity实例。
3)、singleTask 模式;如果在栈中已经有该Activity的实例,以后就不会创建新的实例了,而会重用该实例(
在重用的这个过程中会调用实例的OnNewIntent()这个方法
)。重用时,
如果该Activity实例不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈
。如果栈中不存在该实例,将会创建新的实例放入栈中。
4)、singleInstance 模式;在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
在android系统中,要想直接的关闭整个应用,这是不可能的,而在项目中当需要关闭整个应用时几乎都是采用间接的办法,以上列出的几种方案中其原理都是逐一关闭activity(制造抛异常导致程序强制退出除外),然后退出程序。接下来我们也利用这个原理来实现退出整个应用的目的,在activity启动模式singleTask 模式中,
刚才提到如果该Activity实例存在但不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈
。这样子,我们就可以将应用中的主入口Activity(这里假设主Activity为MainActivity)设置成
singleTask
模式,这样子我们就保证了这个Activity实例存在于栈底中,后面不管有多少其他Activity实例添加进来它始终会在栈底,这时我们只要在要关闭整个应用的那个Activity中把他转到这个Activity来(startActivity(xx.this,MainActivity.class));这样子其他的activity实例就会被移出栈,这时栈中只剩MainActivity实例,如果此时要是再能让这个MainActivity实例移除出栈,那么我们就达到了关闭整个应用的目的,不知道大家刚才有没有注意到OnNewIntent()这个方法,这个方法就是重用activity实例时会被调用,因此我们只要在MainActivity重写该方法并加上一句finish()来关闭当前activity实例我们的目的就达到了……
package com.test.launchmode;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected final void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
startActivity(new Intent(this,xx.class));
}
@Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
this.finish();
}
}
前面我们来先看一下目前网上提供的几种方案:
1.退出单个activity
1)、获取当前进程的id,杀死该进程。
.os.Process.killProcess(android.os.Process.myPid())
2)、终止当前正在运行的Java虚拟机方法。System.exit(0);
3)、finish();
4)、杀包方式。
ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
manager.restartPackage(getPackageName());
添加权限:<uses-permission android:name="android.permission.RESTART_PACKAGES" />;
(在2.2之前可以利用这个退出应用,很遗憾android2.2后失效了,连单个activity都结束不了)
2.退出整个应用(多个Activity)
以下我直接列出网上给出的几种方案,就不做详细说明了。
1)、制造抛异常导致程序强制退出:
2)、用个容器记录每个打开的Activity,在需要退出的时逐一关闭每个Activity
3)、广播方式:
4)、递归退出
在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
3.接下来看一下怎么利用activity启动模式退出整个应用,在这之前我简单的说下activity四种模式的概念,因为这个退出方法跟 activity的启动模式有一定的关系;
1)、standard 模式;也就是默认模式,每次激活Activity时都会创建一个Activity实例,并放入任务栈中。
2)、singleTop 模式;如果在任务栈中的栈定存在该Activity实例,下次激活该Activity实例时就不会创建新的 Activity的实例,直接重用它(
在重用的这个过程中会调用实例的OnNewIntent()这个方法
),否则就创建新的Activity实例。
3)、singleTask 模式;如果在栈中已经有该Activity的实例,以后就不会创建新的实例了,而会重用该实例(
在重用的这个过程中会调用实例的OnNewIntent()这个方法
)。重用时,
如果该Activity实例不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈
。如果栈中不存在该实例,将会创建新的实例放入栈中。
4)、singleInstance 模式;在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。一旦该模式的Activity实例已经存在于某个栈中,任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
在android系统中,要想直接的关闭整个应用,这是不可能的,而在项目中当需要关闭整个应用时几乎都是采用间接的办法,以上列出的几种方案中其原理都是逐一关闭activity(制造抛异常导致程序强制退出除外),然后退出程序。接下来我们也利用这个原理来实现退出整个应用的目的,在activity启动模式singleTask 模式中,
刚才提到如果该Activity实例存在但不是在栈顶,它会让该实例回到栈顶,而它上面的实例将会被移出栈
。这样子,我们就可以将应用中的主入口Activity(这里假设主Activity为MainActivity)设置成
singleTask
模式,这样子我们就保证了这个Activity实例存在于栈底中,后面不管有多少其他Activity实例添加进来它始终会在栈底,这时我们只要在要关闭整个应用的那个Activity中把他转到这个Activity来(startActivity(xx.this,MainActivity.class));这样子其他的activity实例就会被移出栈,这时栈中只剩MainActivity实例,如果此时要是再能让这个MainActivity实例移除出栈,那么我们就达到了关闭整个应用的目的,不知道大家刚才有没有注意到OnNewIntent()这个方法,这个方法就是重用activity实例时会被调用,因此我们只要在MainActivity重写该方法并加上一句finish()来关闭当前activity实例我们的目的就达到了……
package com.test.launchmode;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected final void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
startActivity(new Intent(this,xx.class));
}
@Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
this.finish();
}
}