关闭

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

155人阅读 评论(0) 收藏 举报
分类:
这里介绍两种方法:一种把每个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 交流。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:15912次
    • 积分:355
    • 等级:
    • 排名:千里之外
    • 原创:15篇
    • 转载:32篇
    • 译文:0篇
    • 评论:0条