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

android完全退出程序(android退出有多个activity的应用)

2014-01-22 10:50 399 查看
这里介绍两种方法:一种把每个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();

}

}

====================

20120504对上面代码做个改正:

由于application在项目中其是本身已经是单例了,上面的单例写法有些不妥,而且会报错:

ERROR/AndroidRuntime(5735): java.lang.RuntimeException: Unable to instantiate application com.android.MyApplication: java.lang.IllegalAccessException: access to constructor not allowed

现在改为如下:

private static MyApplication instance;

@Override

public void onCreate() {

super.onCreate();



instance=this;

}

/**

* 获取全局变量

* @return

*/

public static MyApplication getInstance(){



return instance;

}

这样用MyApplication.geiInstance就不会出错了!修改完毕!

在每个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方法

附:此方法也可参考链接:http://maosidiaoxian.iteye.com/blog/1404725

方法二、使用广播
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();

}

...

}

别人写的缺了个地方(unregisterReceiver)这个必须要加,不然会出一堆错,找了个最简单的方法。

=====================================================================

很多网友不知道,Android应用如何完全退出,此前Android123讲过了三种比较常见的方法,参考 Android程序完全退出的三种方法 一文,但是有的网友可能发现Android
2.2中即使使用了Google最新给出的Android 2.2新增API killBackgroundProcesses 方法也无法实现。在J2SE中我们可能使用System.exit(0);
退出,那么我们提到的5种常规方法都无法完全退出怎么办呢?

今天Android开发网给出大家第六种非常规方法,制造异常退出。

1. 首先我们可以制造一个空指针的异常,比如TextView.setText方法中执行一个int型的内容,由于setText方法重载了R.string.xxx这样的资源int型内容,但是我们没有声明这个资源,仅仅把String写成了int的值,就会产生一个异常,这时系统Dalvik VM会直接关闭你的进程,这招十分有效,CWJ一般平时不公布给大家。

2. 但是有的网友说了,有Force Close的对话框怎么办,其实我们通过重写Android应用程序的Application基类自己实现Thread.UncaughtExceptionHandler接口的uncaughtException方法是可以避免出现FC窗口的,用户感觉直接退出了一样。 如果你还有什么疑问可以来函至android123@163.com 交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: