安卓完全退出程序的六种方法

2024-05-12 05:38

本文主要是介绍安卓完全退出程序的六种方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. Dalvik VM的本地方法
   //杀死进程
android.os.Process.killProcess(android.os.Process.myPid())
  //抛异常强制退出
  System.exit(0);
2.任务管理器方法
  //通过activity管理器重启
ActivityManager activitymanager= (ActivityManager)getSystemService (Context.ACTIVITY_SERVICE);
  activitymanager.restartPackage(getPackageName());
  注意:需要注册的权限<uses-permission android:name=\"android.permission.RESTART_PACKAGES\"></uses-  permission>
3.通过封装到栈里一一结束
  //封装界面的容器
List<Activity> activitylist=new LinkedList<Activity>();
//定义我的应用
public static MyApplication instance;

    /*实例化我的应用的方法
    * 如果我的应用为空的话
    * 实例化我的应用
    */
public MyApplication getInstance(){
   if(null==instance){
    
   instance=new MyApplication();
     }
  return instance;
}
/*添加界面的方法
  * 直接调用界面添加
  */
public  void addActivity(Activity activity){
  activitylist.add(activity);
}
/*完全退出我的应用
  * 结束每一个界面
  * 抛异常强制退出
  */
public void exit(){
  
for(Activity activity :activitylist){
   activity.finish();
      }
     System.exit(0);
}
4. 根据Activity的声明周期
我们知道Android的窗口类提供了历史栈,我们可以通过stack的原理来巧妙的实现,这里我们在A窗口打开B 窗口时在Intent中直接加入标志 Intent.FLAG_ACTIVITY_CLEAR_TOP,这样开启B时将会清除该进程空间的所有Activity。
在A窗口中使用下面的代码调用B窗口
Intent intent = new Intent();
intent.setClass(MainActivity.this, SecondActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  //注意本行的FLAG设置
startActivity(intent); 
5.自定义一个Actiivty 栈
通过利用一个单例模式的Activity栈来管理所有Activity。并提供退出所有Activity的方法。代码如下:
public class ScreenManager {
private static Stack<Activity> activityStack;
private static ScreenManager instance;
private  ScreenManager(){
}
public static ScreenManager getScreenManager(){
  if(instance==null){
   instance=new ScreenManager();
  }
  return instance;
}
//退出栈顶Activity
public void popActivity(Activity activity){
  if(activity!=null){
   activity.finish();
   activityStack.remove(activity);
   activity=null;
  }
}

//获得当前栈顶Activity
public Activity currentActivity(){
  Activity activity=activityStack.lastElement();
  return activity;
}

//将当前Activity推入栈中
public void pushActivity(Activity activity){
  if(activityStack==null){
   activityStack=new Stack<Activity>();
  }
  activityStack.add(activity);
}
//退出栈中所有Activity
public void popAllActivityExceptOne(Class cls){
  while(true){
   Activity activity=currentActivity();
   if(activity==null){
    break;
   }
   if(activity.getClass().equals(cls) ){
    break;
   }
   popActivity(activity);
  }
}

6.通过封装超类管里栈继承实现
1.
public class ActivityManager {                  
private Context context;                  
private static ActivityManager activityManager;                  
public static ActivityManager getActivityManager(Context context){                 if(activityManager == null){                         
            activityManager = new ActivityManager(context);                 }                
return activityManager;      
   }                   private ActivityManager(Context context){               
  this.context = context;         
}                   /**          * task map,用于记录activity栈,方便退出程序(这里为了不影响系统回收activity,所以用软引用)          */        private final HashMap<String, SoftReference<Activity>> taskMap = new HashMap<String, SoftReference<Activity>>();                   /**          * 往应用task map加入activity          */        public final void putActivity(Activity atv) {                 taskMap.put(atv.toString(), new SoftReference<Activity>(atv));         }                   /**          * 往应用task map加入activity          */        public final void removeActivity(Activity atv) {                 taskMap.remove(atv.toString());         }                   /**          * 清除应用的task栈,如果程序正常运行这会导致应用退回到桌面          */        public final void exit() {                 
for (Iterator<Entry<String, SoftReference<Activity>>> iterator = taskMap.entrySet().iterator(); iterator.hasNext();) {                         SoftReference<Activity> activityReference =  iterator.next().getValue();                         Activity activity = activityReference.get();                        
if (activity != null) {                                 activity.finish();                         }               
}                 taskMap.clear();         }   } 
2、创建自己的根activity,重写onCreate与onDestory
  public class BaseActivity extends Activity {                   private ActivityManager manager = ActivityManager.getActivityManager(this);                   @Override        protected void onCreate(Bundle savedInstanceState) {                 super.onCreate(savedInstanceState);                 manager.putActivity(this);         }           @Override        protected void onDestroy() {                 super.onDestroy();                 manager.removeActivity(this);         }                   public void exit(){                 manager.exit();         }           } 
3、以后创建的activity都继承这个根activity就可以了,如下:
  public class ExitActivity extends BaseActivity implements OnClickListener{                   private Button start;                   private Button exit;                   private TextView tipTV;                         @Override    public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         start = (Button)findViewById(R.id.start_new_activity);         exit = (Button)findViewById(R.id.exit_all_activity);         tipTV = (TextView)findViewById(R.id.tip_tv);         tipTV.setText("activity:"+this.toString());                   start.setOnClickListener(this);         exit.setOnClickListener(this);     }             @Override        public void onClick(View v) {                 if(v == start){                         Intent intent = new Intent(this , ExitActivity.class);                         startActivity(intent);                 }else if(v == exit){                         exit();                 }         } } 

这篇关于安卓完全退出程序的六种方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/981751

相关文章

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

Springboot3 ResponseEntity 完全使用案例

《Springboot3ResponseEntity完全使用案例》ResponseEntity是SpringBoot中控制HTTP响应的核心工具——它能让你精准定义响应状态码、响应头、响应体,相比... 目录Spring Boot 3 ResponseEntity 完全使用教程前置准备1. 项目基础依赖(M

springboot中配置logback-spring.xml的方法

《springboot中配置logback-spring.xml的方法》文章介绍了如何在SpringBoot项目中配置logback-spring.xml文件来进行日志管理,包括如何定义日志输出方式、... 目录一、在src/main/resources目录下,也就是在classpath路径下创建logba

SQL Server中行转列方法详细讲解

《SQLServer中行转列方法详细讲解》SQL行转列、列转行可以帮助我们更方便地处理数据,生成需要的报表和结果集,:本文主要介绍SQLServer中行转列方法的相关资料,需要的朋友可以参考下... 目录前言一、为什么需要行转列二、行转列的基本概念三、使用PIVOT运算符进行行转列1.创建示例数据表并插入数

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步