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

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

相关文章

macOS无效Launchpad图标轻松删除的4 种实用方法

《macOS无效Launchpad图标轻松删除的4种实用方法》mac中不在appstore上下载的应用经常在删除后它的图标还残留在launchpad中,并且长按图标也不会出现删除符号,下面解决这个问... 在 MACOS 上,Launchpad(也就是「启动台」)是一个便捷的 App 启动工具。但有时候,应

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

CentOS 7部署主域名服务器 DNS的方法

《CentOS7部署主域名服务器DNS的方法》文章详细介绍了在CentOS7上部署主域名服务器DNS的步骤,包括安装BIND服务、配置DNS服务、添加域名区域、创建区域文件、配置反向解析、检查配置... 目录1. 安装 BIND 服务和工具2.  配置 BIND 服务3 . 添加你的域名区域配置4.创建区域

mss32.dll文件丢失怎么办? 电脑提示mss32.dll丢失的多种修复方法

《mss32.dll文件丢失怎么办?电脑提示mss32.dll丢失的多种修复方法》最近,很多电脑用户可能遇到了mss32.dll文件丢失的问题,导致一些应用程序无法正常启动,那么,如何修复这个问题呢... 在电脑常年累月的使用过程中,偶尔会遇到一些问题令人头疼。像是某个程序尝试运行时,系统突然弹出一个错误提

电脑提示找不到openal32.dll文件怎么办? openal32.dll丢失完美修复方法

《电脑提示找不到openal32.dll文件怎么办?openal32.dll丢失完美修复方法》openal32.dll是一种重要的系统文件,当它丢失时,会给我们的电脑带来很大的困扰,很多人都曾经遇到... 在使用电脑过程中,我们常常会遇到一些.dll文件丢失的问题,而openal32.dll的丢失是其中比较