您的位置:首页 > 移动开发 > Android开发

Android中退出多个Activity的方法

2013-12-07 15:13 417 查看
Android2.2之后退出多个Activity变的有些繁琐了,今天查了查资料,退出多个Activity的方法主要有两种:一个是使用单例模式,放在链表中;另一个是使用广播机制。

这两种方法都测试过,可以使用。广播机制的第二个说的详细。

下面的内容是我查看的资料:

第一个:

这里介绍两种方法:一种把每个activity记住,然后逐一干掉;另一种思路是使用广播。本文来源于网络,如有雷同,那是必须的。写此贴只是为了总结一下常用东东,还望原作者莫怪,本人真不是想侵权。
方法一、用list保存activity实例,然后逐一干掉

上代码:

import java.util.LinkedList;

import java.util.List;

import android.app.Activity;

import android.app.AlertDialog;

import android.app.Application;

import android.content.DialogInterface;

import android.content.Intent;
public class SysApplication extends Application {

private List<Activity> mList = new LinkedList<Activity>();

private static SysApplication instance;
private SysApplication() {

}
public synchronized static SysApplication getInstance() {

if (null == instance) {

instance = new SysApplication();

}

return instance;

}
// add Activity

public void addActivity(Activity activity) {

mList.add(activity);

}
public void exit() {

try {

for (Activity activity : mList) {

if (activity != null)

activity.finish();

}

} catch (Exception e) {

e.printStackTrace();

} finally {

System.exit(0);

}

}
@Override

public void onLowMemory() {

super.onLowMemory();

System.gc();

}
}

在每个Activity的onCreate方法中添加类似代码:
[java] public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

SysApplication.getInstance().addActivity(this);

}

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

SysApplication.getInstance().addActivity(this);

}
在需要退出程序的时候,调用:
SysApplication.getInstance().exit();

SysApplication.getInstance().exit();
简而言之,通过单例模式把每个Activity 的引用添加到一个全局链表中,每次退出程序调用System.exit(0)时,先调用链表中Activity 的finish方法

方法二、使用广播
2.2退出整个应用难免让人困扰,曾经一度的尝试一下方式:

ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

manager.killBackgroundProcesses(package);

不行
android.os.Process.killProcess(android.os.Process.myPid());

也不行
manager.restartPackage(package);

还是不行
Intent MyIntent = new Intent(Intent.ACTION_MAIN);

MyIntent.addCategory(Intent.CATEGORY_HOME);

startActivity(MyIntent);

finish();

这个只是退回到桌面,如果打开多个Activity关闭重新打开也会有问题,还是还是不行
看到有说广播机制,发现是个好东东,能彻底解决这个问题,废话不说看代码:

public abstract class EnterActivity extends BaseActivity {

...

// 写一个广播的内部类,当收到动作时,结束activity

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

unregisterReceiver(this); // 这句话必须要写要不会报错,不写虽然能关闭,会报一堆错

((Activity) context).finish();

}

};
@Override

public void onResume() {

super.onResume();
// 在当前的activity中注册广播

IntentFilter filter = new IntentFilter();

filter.addAction(Attribute.PAGENAME);

registerReceiver(this.broadcastReceiver, filter); // 注册

}
/**

* 关闭

*/

public void close() {

Intent intent = new Intent();

intent.setAction(Attribute.PAGENAME); // 说明动作

sendBroadcast(intent);// 该函数用于发送广播

finish();

}

...

}
第二个:

谷歌百度一下,Android中退出多个Activity的方法,大家讨论的很多。

在实习的时候,看到公司的项目退出多个Activity,是采用LinkedList方法,毕业设计的时候,也参照了那种方法。完成之时,无意在网上看到的可以使用广播机制退出Activity。看了一部分人的博客、文章等教程,发现也是摘抄的“很随便”,说的不详细,或不能实现。

看了他们的意思,写了demo,大家看看吧。主要代码如下:(不方便看的直接下整个工程)

为了代码的简洁性,抽取出一个基类BaseActivity(自定义的,当然,你也可以不写这个基类,只要在你项目的每个Activity里实现其中的代码即可),让你代码中要关闭的Activity都继承这个BaseActivity。

Java代码


public class BaseActivity extends Activity {

protected BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

finish();

}

};

@Override

public void onResume() {

super.onResume();

// 在当前的activity中注册广播

IntentFilter filter = new IntentFilter();

filter.addAction("ExitApp");

this.registerReceiver(this.broadcastReceiver, filter);

}

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

this.unregisterReceiver(this.broadcastReceiver);

}

}

在你要关闭的Activity里添加myExit()方法,然后在要进行退出程序操作的地方调用myExit()方法就行。

Java代码


ublic class Activity1 extends BaseActivity {

private Button btn1;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.a1);

btn1 = (Button)findViewById(R.id.btn1);

btn1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(Activity1.this, Activity2.class);

startActivity(i);

}

});

}

/**

* 捕获手机物理菜单键

*/

private long exitTime = 0;

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

if(keyCode == KeyEvent.KEYCODE_BACK){//&& event.getAction() == KeyEvent.ACTION_DOWN

if((System.currentTimeMillis()-exitTime) > 2000){

Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();

exitTime = System.currentTimeMillis();

} else {

myExit();

}

return true;

}

return super.onKeyDown(keyCode, event);

}

protected void myExit() {

Intent intent = new Intent();

intent.setAction("ExitApp");

this.sendBroadcast(intent);

super.finish();

}

}

整个项目工程:

QuitAPP.zip (1.7 MB)
下载次数: 146

路径:
http://www.baidu.com/link?url=UnP0WXOzs_WIgWdglUwi8TeTnas5RtoUPIz2ByJ5TyycF46u87h4OPzM-jQDR7-s874q8YDTUACOS82gPgPstq http://www.baidu.com/link?url=5XUvbQoV5_oMb0ZPSlFOxb9rzwtg63p8utB7ua7evhzDt1xzpupAzyNYc6OfTlel
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: