返回顶部
首页 > 资讯 > 精选 >Android应用关闭的情况及识别方法是什么
  • 359
分享到

Android应用关闭的情况及识别方法是什么

2023-07-02 08:07:51 359人浏览 独家记忆
摘要

这篇“Android应用关闭的情况及识别方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android应用关闭的情况

这篇“Android应用关闭的情况及识别方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android应用关闭的情况及识别方法是什么”文章吧。

    引言

    探讨应用关闭问题的来由和应用保活是关联的,特定类型的应用如:

    • 聊天交友软件

    • 轨迹记录软件

    • 企业内部软件

    • 硬件搭配手机应用检测软件等等

    这些应用是需要保持长时间在后台运行,当应用被关闭后,会造成数据缺失、不完整等问题。通过记录及分析应用关闭原因,反向得出保活方案是否有效,进而改进方案以及提示用户减少导致应用关闭的行为。

    哪些情况会导致应用关闭

    一、系统原因

    • 手机关机

    • 手机低电量、省电模式

    • 内存不足

    • 厂商后台管理或通过自带的手机管家管理行为,如

      • 华为:应用启动管理

      • 小米:神隐模式

      • OPPO:应用速冻

      • VIVO:后台高耗电

      • 三星:未监视的应用程序

      • 360:屏清理、内存加速

      • 魅族:后台管理

      • 是否允许后台运行、锁屏清理等等

      • 场景配置

    二、用户原因

    • 未需保活状态下,用户正常返回退出应用

    • 手动清理掉应用

    • 使用其他第三方手机管理软件,关闭应用

    三、应用自身问题

    • 出现BUG导致应用关闭

    识别方法

    1、应用自身Bug问题

    要说写代码没有bug,只怕谁都会说 老子/臣妾做不到,识别方式就是通过第三方SDK或自己捕获应用Crash,及时修复。另外也可以添加相应的代码在发生Crash后重启应用。

    2、手机关机

    大概有3种情况会关机

    • 用户主动关机

    • 用户设定了定时开关机任务

    • 手机系统自动更新,系统一般是默认WLAN自动下载新版本,且开启夜间自动安装功能。

    识别方法:

    • AndroidManifest注册静态BroadcastReceiver监听开关机广播事件。但是基本是无用,因为开关机广播被手机厂商屏蔽了,需要手动设置打开开关后才能接收到。

    <receiver    android:name=".app.receiver.ShutdownReceiver"    android:enabled="true"    android:exported="true">    <intent-filter android:priority="1000">        <!-- 关机广播 -->        <action android:name="android.intent.action.ACTION_SHUTDOWN" />        <!-- 手机启动完成监听 -->        <action android:name="android.intent.action.BOOT_COMPLETED" />    </intent-filter></receiver>
    • 直接查看手机开机累计时长。在手机“设置”-“关于手机”-“状态信息”里能查看手机的开机累计时长/已开机时间,如果时间和应用关闭时的时间段吻合,说明是手机关机没手动启动应用的缘故。

    可以看出识别开关机是比较有难度的

    3、低电量、省电模式

    手机电量低/省电模式下,系统会关闭非必要的应用,以减少电量消耗。

    识别方法: 通过获取手机电量主观判断是否是低电量,如应用在电量为30还在运行,之后就没有运行记录了,那可能是手机触发省电模式被关闭了。华为手机可以通过代码判断是否处于省电模式。

    手机电量可以通过注册广播监听或者直接通过下列代码获取

    public static int getBatteryLevel(Context context) {    if(context == null){        return -1;    }    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {        BatteryManager batteryManager = (BatteryManager) context.getSystemService(BATTERY_SERVICE);        if (batteryManager == null) {            return -1;        }        return batteryManager.getIntProperty(BatteryManager.BATTERY_PROPERTY_CAPACITY);    } else {        ContextWrapper wrapper = new ContextWrapper(context.getApplicationContext());        Intent intent = wrapper.reGISterReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));        int power = -1;        if(intent != null)power = (intent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1) * 100) / intent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);        return power;    }}

    华为手机判断省电模式PowerUtils.shouldShowPowerSaveModeOption(context),0为为开省电模式,1省电模式。其他品牌手机暂无获取方法。

    public class PowerUtils {    //华为电源管理(设置省电的地方)    public static Intent getPowerSaveModeIntent() {        Intent intent = new Intent();        intent.setComponent(new ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.power.ui.HwPowerManagerActivity"));        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        return intent;    }        public static int shouldShowPowerSaveModeOption(Context context) {        int a = b();        if (a != 1) {            return a;        }        try {            ActivityInfo resolveActivityInfo = getPowerSaveModeIntent().resolveActivityInfo(context.getPackageManager(), 0);            if (resolveActivityInfo == null || !resolveActivityInfo.exported) {                return -1;            }            return a;        } catch (Exception e) {            return -1;        }    }    private static boolean isHuaWeiDevice() {        String brand = Build.BRAND;        if (brand == null) return false;        brand = brand.toLowerCase();        if ("huawei".contains(brand)) {            return true;        }        if ("magic".contains(brand)) {            return true;        }        return "honor".contains(brand);    }    private static int b() {        if (Build.VERSION.SDK_INT < 24 || !isHuaWeiDevice()) {// || !LoggerFactory.getDeviceProperty().isHuaweiDevice()            return -1;        }        if (i()) {            return 1;        }        return 0;    }    private static boolean i() {        return "false".equals(d("persist.sys.perfORMance"));    }    private static Method dd;    private static String d(String str) {        try {            if (dd == null) {                dd = Class.forName("android.os.SystemProperties").getMethod("get", new Class[]{String.class});            }            return (String) dd.invoke(null, new Object[]{str});        } catch (Throwable th) {            return null;        }    }}

    4、内存不足

    这里会有两种情况,一种是应用自身申请的内存超过系统给APP默认分配的内存大小,需要优化应用自身内存占用情况,如果真的需要大内存,就使用largeHeap增加内存的申请量

    <application     android:largeHeap="true"></application>

    另外一种情况是手机自身内存不足,手机开了太多其他软件,导致系统回收关闭应用。

    识别方法: 开发调试阶段可以使用Android Profiler分析应用内存占用情况、LeakCanary检测是否内存泄漏;发布版由应用Crash日志捕获、以及在组件中注册内存回调监听、或者使用第三方库

    //系统正运行于低内存的状态,应用随时可能被关闭public void onLowMemory() {}//预示着你设备的内存资源已经开始紧张,此时尽量释放非必要内存资源public void onTrimMemory(int level) {}

    5、用户正常返回退出应用

    非需后台保活时,用户可以按返回键退出应用,这个直接在退出时做日志记录即可

    6、厂商后台管理与用户手动清理应用

    手动清理掉应用和厂商后台应用管理是相关联的。这里的手动清理指的是使用按键或手势打开的【最近应用列表】页面,然后点单独划掉应用或者点击一键清理应用的行为。Android应用关闭的情况及识别方法是什么

    厂商后台管理指的是

      Android应用关闭的情况及识别方法是什么

    目前应用想要后台保活,只能是引导用户做好相应的【后台运行权限设置】,而用户是否设置正确是否打开对应的开关,没有直接的回调方法,无法判断。

    识别方法:

    虽然没有直接的回调方法判断用户因【手动清理】应用及因没有设置对【后台运行权限】而导致的应用关闭,但是可以通过利用现有的监听接口及分析用户行为间接的判断。

    先说现像:

    • 如果用户没有设置对【后台运行权限】,在【最近应用列表】页面一键清理时,会将应用清理关闭

    • 如果用户没有设置对【后台运行权限】,锁屏后,过一段时间,应用就会被自动清理关闭

    反过来,如果设置对【后台运行权限】,一键清理时,应用不会被清理关闭;锁屏后,应用不会被清理关闭。

    注:是否被清理掉是通过查看应用的前台通知服务是否存在确认的

    根据现像得出判断方法:1、监听手机锁屏事件,锁屏后,如果应用不在运行了,说明是很可能是由于没有设置对【后台运行权限】导致的应用关闭

    //动态注册开锁屏事件监听filter.addAction(Intent.ACTION_SCREEN_ON)filter.addAction(Intent.ACTION_SCREEN_OFF)filter.addAction(Intent.ACTION_USER_PRESENT)

    监听用户打开【最近应用列表】页面事件,如果是打开最近应用列表页面后(如10s内),应用不在运行的,说明没有设置对【后台运行权限】或者是用户主动清理关闭应用。

    ////动态注册手机菜单、HOME键事件监听filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS)

    困惑行为:引导用户设置对后台运行权限是相当考验产品文档及客服人员事情,有的用户其实已经设置对后台运行权限了,但是应用还是关闭了,原因是用户觉得已经设置了【自启动】【允许后台运行】应用就会一直在后台运行,转为做些主动关闭应用的操作,如:在应用信息里点【强行停止】【结束运行】及本文提到的其他导致应用关闭的行为而没有重新手动再次打开应用。

    其实做各种【后台运行权限】设置也只是告诉系统不要去清理关闭应用,让应用在后台运行,但是如果用户主动去关闭应用,系统还是会以用户的想法为准。用户不想让应用运行,那应用就不能运行。

    7、其他原因

    使用第三方应用管理软件、更改应用权限、安装新版本应用、卸载应用等等

    以上就是关于“Android应用关闭的情况及识别方法是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

    --结束END--

    本文标题: Android应用关闭的情况及识别方法是什么

    本文链接: https://lsjlt.com/news/340565.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Android应用关闭的情况及识别方法是什么
      这篇“Android应用关闭的情况及识别方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android应用关闭的情况...
      99+
      2023-07-02
    • Android应用关闭的情况以及识别方法详解
      目录引言哪些情况会导致应用关闭一、系统原因二、用户原因三、应用自身问题识别方法1、应用自身Bug问题2、手机关机3、低电量、省电模式4、内存不足5、用户正常返回退出应用6、厂商...
      99+
      2022-06-09
      方法 关闭 Android
    • android人脸识别开发的方法是什么
      在Android上进行人脸识别开发有以下几种方法:1. 使用OpenCV库:OpenCV是一个开源的计算机视觉库,可以用于人脸检测和...
      99+
      2023-10-09
      android
    • linux查看内存占用情况的方法是什么
      Linux系统中查看内存占用情况的方法有多种。 使用free命令:在终端中输入free命令,即可显示系统的内存使用情况。该命令会...
      99+
      2023-10-23
      linux
    • Android识别NFC芯片制造商的方法是什么
      本篇文章为大家展示了Android识别NFC芯片制造商的方法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如何识别?通过NFC模块的Serial Number即UID,用户访问权限为R只读,每...
      99+
      2023-06-21
    • JavaScript this指向绑定方式及不适用情况是什么
      这篇文章主要讲解了“JavaScript this指向绑定方式及不适用情况是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript this指向绑定方式及...
      99+
      2023-07-06
    • windows关闭defender的方法是什么
      关闭Windows Defender有以下几种方法:方法一:通过Windows Defender设置关闭1. 打开Windows D...
      99+
      2023-09-28
      windows
    • ubuntu关闭nginx的方法是什么
      这篇文章主要介绍了ubuntu关闭nginx的方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇ubuntu关闭nginx的方法是什么文章都会有所收获,下面我们一起来看看吧。ubuntu关闭nginx的方...
      99+
      2023-07-04
    • ubuntu关闭selinux的方法是什么
      本文小编为大家详细介绍“ubuntu关闭selinux的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“ubuntu关闭selinux的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。ubunt...
      99+
      2023-07-04
    • mysql关闭binlog的方法是什么
      要在MySQL中关闭binlog,可以按照以下步骤操作: 登录到MySQL服务器上的命令行或者使用MySQL客户端。执行以下命令来...
      99+
      2024-04-09
      mysql
    • linux关闭redis的方法是什么
      要关闭Redis,可以使用以下几种方法: 使用命令行关闭:可以通过在终端中输入以下命令来关闭Redis: redis-cli s...
      99+
      2024-04-09
      linux redis
    • golang context的使用与关闭方法是什么
      本文小编为大家详细介绍“golang context的使用与关闭方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang context的使用与关闭方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知...
      99+
      2023-07-05
    • centos7关闭端口的方法是什么
      在CentOS 7中,关闭端口的方法有以下几种:1. 使用防火墙(firewalld)命令关闭端口:```shellsudo fir...
      99+
      2023-08-30
      centos7
    • Win7关闭待机的方法是什么
      在Windows 7中关闭待机有以下几种方法:1. 使用开始菜单:点击开始菜单,选择“关机”选项,然后选择“关闭”即可关闭待机。2....
      99+
      2023-10-18
      Win7
    • linux关闭端口的方法是什么
      要关闭Linux上的端口,可以使用防火墙工具iptables来实现。以下是关闭端口的方法: 首先,使用以下命令查看当前打开的端口和...
      99+
      2024-03-14
      linux
    • wordpress后台添加子菜单的常用几种情况及对应方法
      1、在仪表盘添加子菜单: add_submenu_page( 'index.php', … ); 2、在文章处添加子菜单: add_submenu_page( 'edit.php', … );...
      99+
      2022-06-12
      wordpress 添加子菜单
    • MySQL启动和关闭的方法是什么
      这篇文章主要介绍“MySQL启动和关闭的方法是什么”,在日常操作中,相信很多人在MySQL启动和关闭的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL启动和...
      99+
      2024-04-02
    • access关闭数据库的方法是什么
      在不同的编程语言和数据库管理系统中,关闭数据库连接的方法可能会有所不同。以下是一些常见的方法:1. SQL Server: &nbs...
      99+
      2023-09-25
      access 数据库
    • python多线程的关闭方法是什么
      Python中关闭多线程有以下几种方法:1. 通过设置一个全局变量或者标志位来控制线程的执行。在线程的主循环中,通过不断检查这个标志...
      99+
      2023-09-04
      python
    • win10关闭cpu降频的方法是什么
      要关闭Windows 10中的CPU降频,可以尝试以下方法:1. 更改电源计划设置:- 在任务栏搜索栏中输入“电源选项”并打开该设置...
      99+
      2023-09-07
      win10
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作