之前写过一些退出整个activity的方法,但都很繁琐而且效果不是很好。
经过这段时间的学习和应用又有了新的方法。个人感觉很不错很完美的方法。
对于网上所提供的杀进程,杀包等方式不予评价,这里提供一下自己觉得挺好使的二种方法,和大家一起进行分享。
一:利用全局容器
android提供了一个类似于EE中的servletContext的东西-Application。
在application里面我们通常会进行创建一些全局变量或者对应用程序进行一些必要的初始化。
第一个方法的思路就在于,我们可以在application里面创建一个集合容器,用于记录每个打开的activity,一旦我们有退出整个应用程序的需求的时候,我们就可以迭代该集合容器,把该容器里面保存的activity依次关闭。
核心代码如下,详细代码见附件一
- public class BaseApp extends android.app.Application {
- public static Stack<Activity> activitys = new Stack<Activity>();
- /*
- * @see android.app.Application#onCreate()
- */
- @Override
- public void onCreate() {
- // TODO Auto-generated method stub
- super.onCreate();
- }
- public static void pushActivity(Activity mActivity) {
- activitys.add(mActivity);
- }
- public static void popAll() {
- while (!activitys.isEmpty()) {
- Activity act=activitys.pop();
- act.finish();
- }
- }
- }
这个不解释。
二:利用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 都会进入同一个应用中。
在这里我们可以把某个activity设置为singleTask模式,当我们有应用退出需要的时候,我们就可以通过intent打开该activity,然后activity会把其他的activity移出activity栈,然后我们再在该activity的onnewIntent方法进行finnish,那么我们就可以相对完美的退出该应用程序。
核心代码如下,详细见附件二:
- public class MainActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- TextView tv = new TextView(this);
- tv.setText("我是第一个activity");
- tv.setLayoutParams(new LayoutParams(100, 200));
- tv.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent intent = new Intent(MainActivity.this,
- MainActivity02.class);
- startActivity(intent);
- }
- });
- setContentView(tv);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_main, menu);
- return true;
- }
- /*
- * @see android.app.Activity#onNewIntent(android.content.Intent)
- */
- @Override
- protected void onNewIntent(Intent intent) {
- // TODO Auto-generated method stub
- super.onNewIntent(intent);
- finish();
- }
- }
AndroidManifest.xml
<activity
android:name="com.putao.accountbook.MainActivity"
android:launchMode="singleTask"
android:label="@string/app_name" >
简而言之就是将要退出整个应用的activity设置成单例启动模式。然后重写onNewIntent(Intent intent) 方法。
附带说明
Android中Activity启动模式详解
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。
Android总Activity的启动模式分为四种:
Activity启动模式设置: <activity android:name=".MainActivity" android:launchMode="standard" /> Activity的四种启动模式: 1. standard 模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中。 2. singleTop 如果在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例,只要不在栈顶,都会创建实例)。 3. singleTask 如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。如果栈中不存在该实例,将会创建新的实例放入栈中。 4. singleInstance 在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。一旦改模式的Activity的实例存在于某个栈中,任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,不管谁激活该Activity都会进入同一个应用中。希望对大家有帮助