android开发步步为营之7:完美退出应用程序

Android程序关闭方法有多种,网上说的好几种都不可取,比如

1)、android.os.Process.killProcess(android.os.Process.myPid());

实验证明这个方法只能关闭第一个AActivity,该方法不可取,测试手机为android v2.21

2)、ActivityManager activityMgr=

(ActivityManager)CActivity.this.getSystemService(ACTIVITY_SERVICE);

activityMgr.restartPackage(getPackageName());

这个方法也是不可以的关闭应用程序的,测试手机为android v2.21,不知道网上那些人的文章为什么说这么写可以,所以啊,搞技术还得自己多动手

目前总结的可行的方法如下:

一、             每次跳转的时候,就关闭自身这个Activity

这种方法在某个页面需要加载大量数据的情况下就不可取,因为,关闭了,下次还得重新到服务端获取。没有大量数据通信的情况下,这种情况是可取的。

    Intent intent=new Intent(AActivity.this,BActivity.class);

    startActivity(intent);

AActivity.this.finish();

System.exit(0);

 

二、             每个activity的父类里面实现BroadCastReceiver,收到广播后关闭

实验是从AActivity.java跳转到BActivity.java,然后再跳转到CActivity.java,最后在CActivity.java,点击关闭应用程序按钮。关闭应用。然后每个Activity都继承BaseActivity.javaBaseActivity.java注册一个广播接收器,收到广播后关闭自身这个Activity,同时取消注册当前的广播接收器。实验证明这个方法是可以退出应用的,但是不完全,在管理应用程序à正在运行 里面还是可以看到当前的应用的。

1步、父类BaseActivity.java

/**

 父类

 */

package com.figo.helloworld;

 

import android.app.Activity;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.IntentFilter;

import android.os.Bundle;

 

/**

 * @author zhuzhifei

 *

 */

public class BaseActivity extends Activity {

         //这样每个Activity都有个广播接收器

         private BroadcastReceiver mCloseRecver = new BroadcastReceiver() {

                   @Override

                   public void onReceive(Context context, Intent intent) {

                            // TODO Auto-generated method stub

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

                                     ((Activity) context).finish();

                            }

                   }

         };

 

         /** Called when the activity is first created. */

         protected void onCreate(Bundle savedInstanceState) {

                   super.onCreate(savedInstanceState);

 

                   IntentFilter myIntentFilter = new IntentFilter();

                   myIntentFilter.addAction("CLOSE_RECVER");

                   // 注册广播

                   registerReceiver(mCloseRecver, myIntentFilter);

 

         }

 

         @Override

         protected void onDestroy() {

                   // TODO Auto-generated method stub

                   super.onDestroy();

                   //每个activity自己的广播接收器在关闭当前activity的时候,取消该接收器

                   if(mCloseRecver!=null)

                   {

                            this.unregisterReceiver(mCloseRecver);

                   }

         }

        

}

2步、任何关闭的地方发送一个关闭的广播

sendBroadcast(new Intent("CLOSE_RECVER"));

三、             最优做法:统一收集activity,退出时统一关闭

思路:每个Activity OnCreate的时候,就加入ApplicationActivity数组里面去,然后任何一个地方退出的时候,调用Aplication一个exit方法,循环关闭每个Activity,同时记得System.exit(0),本实验也同方法二一样,A,B,C三个Activity,从A跳转到BB再跳转到C,然后再C点击一个退出应用按钮,使用完全退出当前应用。

1步、创建自己的Application.java

/**

 管理ActivityApplication

 */

package com.figo.helloworld;

 

import java.util.ArrayList;

 

import android.app.Activity;

import android.app.Application;

 

/**

 * @author zhuzhifei

 *

 */

public class MyApplication extends Application {

         private ArrayList<Activity> allActivities = new ArrayList<Activity>();

         private static MyApplication instance;

 

         public static MyApplication getInstance() {

                   if (instance == null) {

                            instance = new MyApplication();

                   }

                   return instance;

         }

 

         // 添加Activity到容器中

         public void addActivity(Activity activity) {

                   allActivities.add(activity);

         }

 

         // 遍历所有Activityfinish

         public void exit() {

                   for (Activity activity : allActivities) {

                            activity.finish();

                   }

                   System.exit(0);//Android的程序只是让Activity finish(),而单纯的finish,退出并不完全

                   instance=null;//自身也清空

         }

 

 

}

2步、创建各个Activity

A页面AActivity.java

/**

 @author zhuzhifei

 *

 */

public class AActivity extends Activity {

    private Button btnA;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.a);

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

       btnA.setOnClickListener(new OnClickListener() {

          

           @Override

           public void onClick(View v) {

              //A跳转到B页面

              Intent intent=new Intent(AActivity.this,BActivity.class);

              startActivity(intent);

           }

       });

       //当前Activity添加到Activity数组中去

       MyApplication.getInstance().addActivity(this);

    }

 

}

 

B页面BActivity.java

/**

 @author zhuzhifei

 *

 */

public class BActivity extends BaseActivity {

    private Button btnB;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.b);

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

       btnB.setOnClickListener(new OnClickListener() {

          

           @Override

           public void onClick(View v) {

              //B跳转到C页面

              Intent intent=new Intent(BActivity.this,CActivity.class);

              startActivity(intent);

           }

       });

       //当前Activity添加到Activity数组中去

       MyApplication.getInstance().addActivity(this);

    }

}

 

C页面CActivity.java

 

/**

 @author zhuzhifei

 *

 */

public class CActivity extends Activity {

      private Button btnC;

       @Override

       protected void onCreate(Bundle savedInstanceState) {

           super.onCreate(savedInstanceState);

           setContentView(R.layout.c);

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

           //退出应用程序事件

           btnC.setOnClickListener(new OnClickListener() {

              @Override

              public void onClick(View v) {

                  //最优做法 方法一:Activity放在数组里面统一关闭

                  MyApplication.getInstance().exit();

                  //实验证明这个方法只能关闭第一个AActivity,该方法不可取,测试手机为android v2.21

//                  android.os.Process.killProcess(android.os.Process.myPid());

                  //这个方法也是不可以的关闭应用程序的,不知道网上那些人的文章为什么还写可以,所以啊,搞技术还得自己多动手

//                ActivityManager activityMgr= (ActivityManager)CActivity.this.getSystemService(ACTIVITY_SERVICE);

//                activityMgr.restartPackage(getPackageName());

                    //方法二:父类activity里面实现一个广播接收器,发现需要关闭的时候即关闭自己这个Activity

                  //实验证明当前方式是可以退出应用程序,但是在管理应用程序-->正在运行里面还可以看见当前应用

             

                  //sendBroadcast(new Intent("CLOSE_RECVER"));

                   

              }

           });

           //当前Activity添加到Activity数组中去

           MyApplication.getInstance().addActivity(this);

       }

}

四、另外一种思路是在baseActivity.java里面的onResume()事件里面,如果发现是需要关闭程序,然后finish当前activity,因为,如果activity都不关闭,最终关闭一个的时候,会引起连锁反应,关闭一个的时候,它后面的另外一个就会到resume。具体做法是在application设置一个是否退出的变量                                               

    @Override
    protected void onResume() {
        super.onResume();
           Boolean isExit = (Boolean) getMyApplication().get("EXIT_APP");
        if (isExit != null && isExit)
         {
            finish();
         }
    }

 

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值