利用Android两行代码真正杀死你的App

作者:康小白Code 时间:2023-04-07 17:15:46 

Android上杀掉进程的方式有两种,分别是System.exit(0)和Process.killProcess(Process.myPid()),这两种方法比较暴力,App进程会被直接杀掉,但是由于Android的安全机制,你会发现,在调用上述两种方法后,App会被自动重启,并未达到我们想要的杀死状态!

那我们该怎样实现真正的杀死App呢?

我认为需要两个步骤:

一、关闭打开的所有Activity

二、调用System.exit(0)或Process.killProcess(Process.myPid())

先介绍两种关闭所有Activity的方法:

1、这第一种方法是郭神在《第一行代码》中讲到的,我在这引用一下。

首先我们需要用一个专门的集合类对所有的活动进行管理,新建一个ActivityCollector类作为活动管理器,代码如下所示:


private static List<Activity> activities = new ArrayList<>();

public static void addActivity(Activity activity) {
 activities.add(activity);
}
public static void removeActivity(Activity activity) {
 activities.remove(activity);
}
public static void finishAll() {
 for (Activity activity : activities) {
  if (!activity.isFinishing()) {
   activity.finish();
  }
 }
 activities.clear();
}

在活动管理器中,我们通过一个List来暂存活动,然后提供了addActivity()方法用于向List中添加一个活动,提供了removeActivity()方法用于从List中移除活动,最后提供了finishAll()方法用于将List中存储的活动全部销毁掉。

接下来我们创建一个BaseActivity(这是一个继承至AppCompatActivity的普通java类,不需要在AndroidManifest中注册),之后我们所创建的所有Activity均需要继承至这个BaseActivity,

代码如下所示:


public class BaseActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 Log.d("BaseActivity", getClass().getSimpleName());
 ActivityCollector.addActivity(this);
}

@Override
protected void onDestroy() {
 super.onDestroy();
 ActivityCollector.removeActivity(this);
}

}

在BaseActivity的onCreate()方法中调用了ActivityCollector的addActivity()方法,表明将当前正在创建的活动添加到活动管理器里。

然后在BaseActivity中重写onDestroy()方法,并调用了ActivityCollector的removeActivity()方法,表明将一个马上要销毁的活动从活动管理器里移除。

从此以后,不管你想在什么地方退出程序,只需要调用ActivityCollector.finishAll()方法就可以了。

2、这第二种方法相当简单给力!只需要一行代码!

在Activity中:

finishAffinity();

如果在Fragment中:

getActivity().finishAffinity();

OK!现在我们已经将所有Activity关闭了,接下来只需要调用System.exit(0)或Process.killProcess(Process.myPid())中的一种,就可以实现在任意地方,随时随地真正的杀死App了!

来源:https://blog.csdn.net/k_bb_666/article/details/78983721

标签:Android,杀死,App
0
投稿

猜你喜欢

  • 基于struts2和hibernate实现登录和注册功能

    2022-03-23 00:27:43
  • MyBatis中一对多的xml配置方式(嵌套查询/嵌套结果)

    2023-11-16 16:34:23
  • C#中使用快速排序按文件创建时间将文件排序的源码

    2023-06-04 08:19:19
  • Android自定义控件ViewGroup实现标签云(四)

    2021-11-30 14:58:36
  • sigsetjmp的用法总结

    2023-06-05 07:12:07
  • Spring Boot和Thymeleaf整合结合JPA实现分页效果(实例代码)

    2023-11-25 07:05:15
  • Maven工程打包jar的多种方式

    2022-12-15 06:54:46
  • java 优雅关闭线程池的方案

    2022-03-20 23:05:44
  • C# 添加、修改和删除PDF书签的实例代码

    2022-09-24 06:45:55
  • Android自定义荷载进度的两种方法

    2022-08-29 03:21:39
  • Swagger及knife4j的基本使用详解

    2023-02-13 09:34:00
  • VSCODE+cmake配置C++开发环境的实现步骤

    2023-05-31 21:25:14
  • springboot集成shiro权限管理简单实现

    2023-10-27 13:39:02
  • springboot项目如何设置session的过期时间

    2022-12-31 23:45:27
  • SSM项目使用拦截器实现登录验证功能

    2023-06-17 16:12:38
  • Java编程实现判断网上邻居文件是否存在的方法

    2022-12-27 09:49:46
  • 有关Java中的BeanInfo介绍

    2023-08-05 00:13:42
  • Java 中的 xx ≠ null 是什么新语法

    2022-09-10 20:51:13
  • Java String 拼接字符串原理详解

    2023-05-14 10:10:33
  • Android实现局部图片滑动指引效果示例

    2022-10-16 03:05:53
  • asp之家 软件编程 m.aspxhome.com