`
mmdev
  • 浏览: 12914675 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

Android利用activity启动模式退出整个应用

 
阅读更多
前面我们来先看一下目前网上提供的几种方案:
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 classMainActivity 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();
}
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics