• 保存到桌面  加入收藏  设为首页
安卓应用

安卓-如何安全退出多个Activity?(含退出整个程序)

时间:2016-10-18 12:48:28   作者:胜行天下   来源:胜行天下   阅读:862   评论:0

来自安卓第一行代码(只看java文件,不需要看xml)

Practise-一次性退出Activity.rar

退出程序
            android.os.Process.killProcess(android.os.Process.myPid()); //(有的程序关闭会重启 这句话不能完全退出程序)
//彻底退出程序
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            this.startActivity(intent);
            System.exit(0);

我们在项目开发的时候可能会遇到安全退出应用的场景,如何能够安全退出多个Activity?

1、抛异常退出

该方法通过抛异常,使程序Force Close。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force Close的窗口。

2、记录打开的Activity

每打开一个Activity,就记录下来。在需要退出时,关闭每一个Activity即可。

3、发送特定广播

在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。

4、递归退出

在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。

第二种方法实现

定义一个Application类来存储Activity对象的引用

package com.maso.wuye.activity;    

import java.util.LinkedList;  

import java.util.List;    

import android.app.Activity;  

import android.app.Application;    

public class ExitApplication extends Application {    

    private List activityList = new LinkedList();  

    private static ExitApplication instance;    

    private ExitApplication() {            

    }    

    // 单例模式中获取唯一的ExitApplication实例  

    public static ExitApplication getInstance() {  

        if (null == instance) {  

            instance = new ExitApplication();  

        }  

        return instance;    

    }    

    // 添加Activity到容器中  

    public void addActivity(Activity activity) {  

        activityList.add(activity);  

    }    

    // 遍历所有Activity并finish    

    public void exit() {    

        for (Activity activity : activityList) {  

            activity.finish();  

        }    

        System.exit(0);            

}

}

安卓-如何安全退出多个Activity?(含退出整个程序)

以上这个方法 具体使用未 测试 !(与下面的方面区别在于有没有在需要退出的Activity中手动添加exit方法)

————————————————————————————————


public class ExitAppliation extends Application

{

    private List activityList = new LinkedList();

    private static ExitAppliation instance;

    private ExitAppliation()

    {

    }

    // 单例模式中获取唯一的MyApplication实例

    public static ExitAppliation getInstance()

    {

        if (null == instance)

        {

            instance = new ExitAppliation();

        }

        return instance;

    }

    //添加Activity到容器中

    public void addActivity(Activity activity)

    {

        activityList.add(activity);

    }

    // 遍历所有Activity并finish

    public void exit()

    {

        for (Activity activity : activityList)

        {

            activity.finish();

        }

        System.exit(0);

    }

}


注:Application类是为了那些需要保存全局变量设计的基本类,你可以在AndroidManifest.xml的标签中进行自己的实现,这样的结果是:当你的application或者包被建立的时候将引起那个类被建立。就是说application是用来保存全局变量的,并且是在package创建的时候就跟着存在了。所以当我们需要创建全局变量的时候,不需 要再像j2se那样需要创建public权限的static变量,而直接在application中去实现。只需要调用Context的getApplicationContext或者Activity的getApplication方法来获得一个application对象,再做出相应 的处理。


然后在每个Activity的onCreate()方法中添加下面代码:
ExitAppliation.getInstance().addActivity(this);

在需要结束所有Activity的时候调用exit方法:
ExitAppliation.getInstance().exit();

----------------------------------------------------------------------------------------------------

通过通知来完成

Java代码  收藏代码
  1. public class BaseActivity extends Activity {  
  2.     protected BroadcastReceiver broadcastReceiver = new BroadcastReceiver() {  
  3.         @Override  
  4.         public void onReceive(Context context, Intent intent) {  
  5.             finish();  
  6.         }  
  7.     };  
  8.       
  9.     @Override  
  10.     public void onResume() {  
  11.         super.onResume();  
  12.         // 在当前的activity中注册广播  
  13.         IntentFilter filter = new IntentFilter();  
  14.         filter.addAction("ExitApp");  
  15.         this.registerReceiver(this.broadcastReceiver, filter);  
  16.     }  
  17.       
  18.     @Override  
  19.     protected void onDestroy() {  
  20.         // TODO Auto-generated method stub  
  21.         super.onDestroy();  
  22.         this.unregisterReceiver(this.broadcastReceiver);    
  23.     }  
  24. }  
 


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


  1. public class Activity1 extends BaseActivity {  
  2.     private Button btn1;  
  3.       
  4.     @Override  
  5.     protected void onCreate(Bundle savedInstanceState) {  
  6.         // TODO Auto-generated method stub  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.a1);  
  9.           
  10.         btn1 = (Button)findViewById(R.id.btn1);  
  11.         btn1.setOnClickListener(new View.OnClickListener() {  
  12.               
  13.             @Override  
  14.             public void onClick(View v) {  
  15.                 Intent i = new Intent(Activity1.this, Activity2.class);  
  16.                 startActivity(i);  
  17.             }  
  18.         });  
  19.     }  
  20.     /** 
  21.      * 捕获手机物理菜单键 
  22.      */  
  23.     private long exitTime = 0;  //这个一定要放在放在方法名称外面。
  24.   
  25.     @Override  
  26.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  27.         if(keyCode == KeyEvent.KEYCODE_BACK){//&& event.getAction() == KeyEvent.ACTION_DOWN  
  28.             if((System.currentTimeMillis()-exitTime) > 2000){  
  29.                 Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();  
  30.                 exitTime = System.currentTimeMillis();  
  31.             } else {  
  32.                 myExit();  //小于2000,说明是在2秒内在线按下的返回键
  33.             }  
  34.             return true;  
  35.         }  
  36.         return super.onKeyDown(keyCode, event);  //在onBackPressed()中,super()方法要删除
  37.     }  
  38.       
  39.     protected void myExit() {  
  40.         Intent intent = new Intent();  
  41.         intent.setAction("ExitApp");  
  42.         this.sendBroadcast(intent);  
  43.         super.finish();  
  44.     }  
  45.     //另外还有生活小助手项目中退出方法 ,通过Timer中的计划方法来退出(可百度)
  46. }  





退出整个程序

            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            this.startActivity(intent);
            System.exit(0);






有任何疑问或技术合作都可联系我

微信:yanfahezuo 【推荐】

QQ:596957738


相关评论

加我微信 596957738 (QQ同号)加我微信     QQ联系:596957738    地址:江苏省南京市浦口区

苏ICP备2023050353号

   

苏公网安备32011402010305号

江节胜的Gitee,江节胜的Git地址