对于网上所提供的杀进程,杀包等方式不予评价,这里提供一下自己觉得挺好使的二种方法,和大家一起进行分享。
一:利用全局容器
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(); } }