文档章节

Android 退出整个应用程序解决方案

蜀山下的鱼
 蜀山下的鱼
发布于 2015/04/29 00:45
字数 798
阅读 37
收藏 0

1、通过广播

相信有过项目经验的同学都遇到过这样的问题,就是设计“退出”功能时可能会遇到有些界面不能关闭的问题。当然如果你的项目所有的界面都在打开另一个界面时被关闭就不存在这个问题了,但大多数情况下这样是很不合理的,因为每次要查看这个界面都需要重新加载数据。尤其对于需要走网络的数据显示,这不仅效率低而且成本高。

网上大概有以下几种方法解决这个问题:

复制代码
(1)     System.exit(0);

(2)     Process.killProcess(Process.myPid());

(3)     ActivityManager activityManager = (ActivityManager) this

                  .getSystemService(Context.ACTIVITY_SERVICE);

activityManager.restartPackage("packagename");
复制代码

但这些貌似不是万能的,有的说在2.2版本后就失效了,那我们怎么办呢?在起初的一个项目里我用了一个比较笨的方法,我用一个类来专门管理所有的Activity。这个类里有一个List,每打开一个Activity我就把这个Activity放到这个List中,当退出时再将List中所有的Activity一个一个的关闭。

在后来的项目中发现了一个更好地方法,就是通过广播来完成退出功能,具体实现过程是这样的:在每个Activity创建时(onCreate时)给Activity注册一个广播接收器,当退出时发送该广播即可。大概的代码如下:

复制代码
@Override

protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       IntentFilter filter = new IntentFilter();

       filter.addAction("finish");

       registerReceiver(mFinishReceiver, filter);

       ……

}

private BroadcastReceiver mFinishReceiver = new BroadcastReceiver() {

    @Override

    public void onReceive(Context context, Intent intent) {

           if("finish".equals(intent.getAction())) {

              Log.e("#########", "I am " + getLocalClassName()

                     + ",now finishing myself...");

              finish();

       }

    }

};
复制代码

相信聪明的大家会把上面的代码写在一个基类里面,因为如果你的项目中Activity很多的话,写起来很麻烦,而且也不符合代码规范。

 

 

在退出时执行以下代码即可关闭所有界面完全退出程序:

getApplicationContext().sendBroadcast(new Intent("finish"));

转载:http://www.cnblogs.com/wader2011/archive/2011/10/10/2205161.html

2、使用退出类

复制代码
public class CloseActivity
{
    private static LinkedList<Activity> acys = new LinkedList<Activity>();

    public static Activity curActivity;
    
    public static void add(Activity acy)
    {
        acys.add(acy);
    }

    public static void remove(Activity acy) {
        acys.remove(acy);
    }
    
    public static void close()
    {
        Activity acy;
        while (acys.size() != 0)
        {
            acy = acys.poll();
            if (!acy.isFinishing())
            {
                acy.finish();
            }
        }
//        android.os.Process.killProcess(android.os.Process.myPid());
    }
}
复制代码

3、

我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在D窗口打开A窗口时在Intent中直接加入标志Intent.FLAG_ACTIVITY_CLEAR_TOP,再次开启A时将会清除该进程空间的所有Activity。 在D中使用下面的代码: Intent intent = new Intent(); intent.setClass(D.this, A.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置 startActivity(intent); finish();关掉自己 在A中加入代码: Override

protected void onNewIntent(Intent intent) { // TODO Auto-generated method stub

super.onNewIntent(intent);

//退出

        if ((Intent.FLAG_ACTIVITY_CLEAR_TOP & intent.getFlags()) != 0) {

               finish();

        }

}

A的Manifest.xml配置成android:launchMode="singleTop"

原理总结: 一般A是程序的入口点,从D起一个A的activity,加入标识Intent.FLAG_ACTIVITY_CLEAR_TOP这个过程中会把栈中B,C,都清理掉。因为A是android:launchMode="singleTop" 不会调用oncreate(),而是响应onNewIntent()这时候判断Intent.FLAG_ACTIVITY_CLEAR_TOP,然后把A finish()掉。 栈中A,B,C,D全部被清理。所以整个程序退出了。

本文转载自:http://blog.csdn.net/caiwenfeng_for_23/article/details/12710617

蜀山下的鱼
粉丝 9
博文 405
码字总数 0
作品 0
广州
高级程序员
私信 提问
[Andriod] android中singleTask的home键的问题

在Android设计中遇到这样一个问题: Activity A,在AndroidManifest.xml中设置它的一个<inter-filter>为 Java代码 <intent-filter> <action android:name="android.intent.action.MAIN" /> <......

枫兮兮
2014/03/19
0
0
android 安全退出应用程序

正常关闭应用程序: 当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程。 android.os.Process.killProcess(and...

长平狐
2012/09/03
248
0
Android程序的隐藏与退出

Android的程序无需刻意的去退出, 当你一按下手机的back键的时候,系统会默认调用程序栈中最上层Activity的Destroy()方法来销毁当前Activity,当此 Activity又被其它Activity启动起来的时候,会...

鉴客
2011/11/22
412
0
WebView内存泄露的解决方案

一、简介: 做Android开发的相信都对webview不会陌生,而且也对系统自带的webview本身存在的问题也是怨念很久了,一方面是本身对js的支持不是很好另外一方面就是经常被人诟病的内存泄露了,网...

北辰丨丶
03/06
0
0
Sencha Touch 程序设计之 Android 平台 Back 按键处理

用 Sencha Touch 结合PhoneGap设计本地APP,免不了要分别处理android平台和iphone平台,两个平台的最大区别之一就是back键的处理。iphone平台没有back按键,只有home按键,按下该键的话程序会...

罗盛力
2012/11/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux下ctrl+c中止不了

有一台centos7的服务器,ctrl+c无效,并且tail -f也无效,只能关掉终端或者crtl+z放入后台再删掉,但是ping的时候使用ctrl+c是有效果的。 出现这种情况的原因可能是因为有人要使用ruby安装r...

gaolongquan
26分钟前
1
0
Android三年工作面经

工作三年出来看看新的机会,依次面试过如下公司: 小米(北京) iHandy(北京) 涂鸦智能(杭州) 微软(北京) 宜信(北京) 蚂蚁金服(杭州) 瓜子二手车(北京) 高德(北京) 基本上投递的简历都得到了面...

JerryLin123
29分钟前
2
0
开发函数计算的正确姿势——tensorflow serving

前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计...

阿里云云栖社区
33分钟前
7
0
社区角色(Kubernetes社区Maintainer是什么角色?)

社区成员按照角色,分为member、reviewer、approver、subproject owner。 下面我们介绍一下每个角色的职责和要求。 member reviewer approver subproject owner...

恋恋美食
50分钟前
1
0
【JavaScript】callee 与 caller

callee callee是函数参数arguments对象的一个属性,它指向参数arguments对象所在的函数自身。 function foo (x) {console.log(arguments.callee);return x;}foo(); 从控制台中可以看...

小草先森
53分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部