Android在第三方应用程序系统应用尽早开始,杀死自己主动的第三方应用程序,以重新启动...

1.为什么第三方应用程序可能早于System的app启动?

      Android能够查阅了,这里就不细述了,这里不阐述ROM启动还有bootloader。软件启动的大致流程应该是

  • 启动kernel
  • 执行servicemanager 把一些native的服务用命令启动起来(包含wifi, power, rild, surfaceflinger, mediaserver等等)
  • 启动Dalivk中的第一个进程Zygote -> 启动java 层的系统服务system_server(包含PowerManagerService, ActivityManagerService , telephony.registry, DisplayManagerService等等)该服务中的这些部件跟native的那些服务关联在一起
  • 启动Luncher和Persistent的App,该程序是系统级的在AndroidManifest.xml里声明android:persistent="true"
  • 发出ACTION_BOOT_COMPLETED广播给其它应用。

       在这里须要注意的是声明android:persistent属性为true的APP被kill掉后还是会自己主动重新启动的。系统中我们已知android:persistent属性为true的APP肯定有Phone App,也就是说第三方应用应当至少晚于Phone APP启动,怎样推断呢?最简单的办法看其PID的大小,PID值越小越先启动。有其第三方应用能够先于Phone APP启动。我们探其应用的AndroidManifest.xml (PS:怎样看APK的代码,网上有你懂的apktool等),发现其在AndroidManifest里定义的静态Receiver的intent-filter的属性例如以下:

       <receiver android:name="com.anguanjia.safe.AAAReceiver"><intent-filter android:priority="2147483647"></span><action android:name="android.bluetooth.adapter.action.STATE_CHANGED" /><action android:name="android.net.wifi.WIFI_STATE_CHANGED" /><action android:name="android.net.conn.CONNECTIVITY_CHANGE" /><action android:name="android.intent.action.ANY_DATA_STATE" /><action android:name="android.net.wifi.STATE_CHANGE" /></intent-filter><intent-filter android:priority="2147483647"><action android:name="android.intent.action.MEDIA_UNMOUNTED" /><action android:name="android.intent.action.MEDIA_MOUNTED" /><action android:name="android.intent.action.MEDIA_REMOVED" /><action android:name="android.intent.action.MEDIA_CHECKING" /><action android:name="android.intent.action.MEDIA_EJECT" /><data android:scheme="file" /></intent-filter>

2147483647 这个值是什么?好大,哦,原来是int的最大值!

我们来看下google 文档

android:priority
    The priority that should be given to the parent component with regard to handling intents of the type described by the filter. This attribute has meaning for both activities and broadcast receivers:

        It provides information about how able an activity is to respond to an intent that matches the filter, relative to other activities that could also respond to the intent. When an intent could be handled by multiple activities with different priorities, Android will consider only those with higher priority values as potential targets for the intent.

        It controls the order in which broadcast receivers are executed to receive broadcast messages. Those with higher priority values are called before those with lower values. (The order applies only to synchronous messages; it's ignored for asynchronous messages.)

    Use this attribute only if you really need to impose a specific order in which the broadcasts are received, or want to force Android to prefer one activity over others.

    The value must be an integer, such as "100". Higher numbers have a higher priority. The default value is 0. The value must be greater than -1000 and less than 1000.

        这个值是receiver的优先级,值越大优先级越高,按优先顺序运行,可是文档介绍优先级值大小是-1000~1000. 该应用的是int的最大值, 但android平台没有对android:priority值进行检查。在开机后该应用Receiver的intent-filter的优先级最高,在该filter里的intent被系统发送出来(android.intent.action.MEDIA_MOUNTE, android.net.wifi.WIFI_STATE_CHANGED等等),这个时候App会依据这个intent而被启动起来。

         这里须要注意的是该Receiver是个静态的,一定是要注冊在AndroidManifest里。

当Wifi成功注冊后会发出WIFI_STATE_CHANGED的消息, 或者其它的部件完毕一些事件后也会发出类似的消息。而这些消息的发出又早于属性为persistent的系统级APP的启动, 由此就会发生第三方应用早于系统级APP的启动的情况。


2. 在Android手机上为什么我想全然关闭的程序关不了?

        有一种理论是Android手机为了有更好的用户体验。会后台自己主动启动一些程序。 这样我们前台在操作的时候会感觉手机更流畅平滑。

可是假设程序执行过多。对CPU 内存的开销过大,往往会导致系统越用越慢,乃至手机挂掉的问题,在内存管理这快Android有两种机制去解决问题,一个是在framework层在 trimApplication方法中去实现,另外一个就是在kernel里的lowmemorykiller。 这里不再细述。
        可是对于用户来说。我就是想全然关闭第三方程序,以免过多使用我的流量或者偷偷的做一些我不希望的操作。貌似没有办法去关闭,那为什么呢? 我这里先讲述当中一种情况。
          Service顾名思义是服务。执行在前后台后都能够,即能够执行在当前进程也能够执行在其它的进程里,Service能够为多个APP共享使用,是通过binder机制来实现的。当我Kill掉一个带有服务的进程(没有调用stopService()), 过一会该应用会自己主动重新启动。以下是代码的调用顺序。自下往上查看。

com.android.server.am.ActiveServices.scheduleServiceRestartLocked(ActiveServices.java)

com.android.server.am.ActiveServices.killServicesLocked (ActiveServices.java)

com.android.server.am.ActivityManagerService.cleanUpApplicationRecordLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService.appDiedLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java)

        从代码流程上我们看出该service被restart。进程也依据该service启动起来, service就执行在重新启动的进程里。

        在这样的情况下是不是就真没办法了呢,当然不是。假设我们在service中覆盖onStartCommand这个函数而且返回值为START_NOT_STICKY,在我们kill该进程后则不会自己主动重新启动,我们想关闭的应用也能够全然关闭了。不会再自己主动重新启动了。

    public int onStartCommand(Intent intent, int flags, int startId) {return START_NOT_STICKY;}

Framwork实现代码

frameworks/base/services/java/com/android/server/am/ActiveServices.javacase Service.START_NOT_STICKY: {// We are done with the associated start arguments.r.findDeliveredStart(startId, true);if (r.getLastStartId() == startId) {// There is no more work, and this service// doesn't want to hang around if killed.r.stopIfKilled = true;   // 该变量设置为true}break;}if (sr.startRequested && (sr.stopIfKilled || canceled)) {    //进入到该条件中if (sr.pendingStarts.size() == 0) {sr.startRequested = false;if (sr.tracker != null) {sr.tracker.setStarted(false, mAm.mProcessStats.getMemFactorLocked(),SystemClock.uptimeMillis());}if (!sr.hasAutoCreateConnections()) {// Whoops, no reason to restart!bringDownServiceLocked(sr);  //运行在这里。不会重新启动App}}}

        重写onStartCommand方法且返回值为START_NOT_STICKY的代码调用顺序,自下而上查看。

com.android.server.am.ActiveServices.bringDownServiceLocked(ActiveServices.java)

com.android.server.am.ActiveServices.killServicesLocked(ActiveServices.java)

com.android.server.am.ActivityManagerService.cleanUpApplicationRecordLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService.handleAppDiedLocked(ActivityManagerService.java)

com.android.server.am.ActivityManagerService.appDiedLocked(Activi tyManagerService.java)

com.android.server.am.ActivityManagerService$AppDeathRecipient.binderDied(ActivityManagerService.java)

        附上Google doc 对于onStartCommand返回值的说明

For started services, there are two additional major modes of operation they can decide to run in, depending on the value they return from onStartCommand():START_STICKY is used for services that are explicitly started and stopped as needed, whileSTART_NOT_STICKY orSTART_REDELIVER_INTENT are used for services that should only remain running while processing any commands sent to them. See the linked documentation for more detail on the semantics.

       在这里对这个返回值做下解释:

当服务进程因某种原因(内存不够,强制关闭等)被kill掉时,START_STICKY再次,在系统中创建了后有足够的内存service, 在onStartCommand在handle它是null intent.

START_NOT_STICKY通知系统不会再次创建service. 另一种回报值START_REDELIVER_INTENT再创service而伴随着原intent围棋处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 11 新特性:列表模式匹配

之前使用模式匹配&#xff0c;可以测试表达式结果是否等于指定的常量或者在某个范围内&#xff1a;public static string Demo(int number) {return number switch{100 > "A",>90 >"B",_ > "C"}; }上面的代码&#xff0c;执行逻辑如…

装饰一个类及内部方法

通过装饰器函数修改一个类属性class MyClass:NAME My CLASS HAHAHAdef __init__(self):passprint(MyClass.__dict__[NAME])My CLASS HAHAHA等价于&#xff1a;def setname(name):def warpper(cls): cls.NAME namereturn clsreturn warppersetname(MY CLASS enen) #class M…

G2 2.0 更灵活、更强大、更完备的可视化引擎!

概述 G2作为一款技术产品&#xff0c;自诞生以来&#xff0c;服务于广大的Web工程师群体和一部分数据分析师。一直来&#xff0c;G2 因其易用的语法和扎实的可视化理论基础&#xff0c;广受使用者好评。G2 1.x 的可视化能力已经非常强大&#xff0c;使用者已经能够在掌握图形语…

C语言试题十六之写删除字符串中指定下标的字符。其中,a指向原字符串,删除后的字符串存放在b所指的数组中,n中存放指定的下标。

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

《iVX 高仿美团APP制作移动端完整项目》07 会员页制作

会员页如下&#xff1a; 一、会员页标题制作 会员页的标题是顶部的提示字样&#xff0c;该字样咱们可以分析&#xff0c;可以使用两个文本组件&#xff0c;每个占据一行&#xff1a; 首先咱们创建一个页面命名为会员中心&#xff1a; 接着在会员中心下创建一个行&#xff…

【ArcGIS风暴】ArcGIS添加超链接的两种方法详解

文章目录 1. 在识别对话框中添加超链接2. 利用属性字段添加超链接在ArcGIS中,可以很方便的设置文档超链接和URL超链接,设置完成后,只需要点击某个图斑就可以跳到指定的地址。本文详细讲解ArcGIS中超链接的设置方法。 1. 在识别对话框中添加超链接 启动软件,加载甘肃省行政…

Android Studio目录结构分析

Android studio 目录结构1. .gradleGradle编译系统&#xff0c;版本由wrapper指定2. .ideaAndroid Studio IDE所需要的文件3. app3.1 app/buildapp模块编译输出的文件3.2 app/libs放置引用的类库文件3.3 app/src放置应用的主要文件目录3.4 app/.gitgnoregit使用的ignore文件3.5…

《iVX 高仿美团APP制作移动端完整项目》08 会员页 标题、会员卡 制作

一、分类制作 我们接着往下制作该页的下半部分内容&#xff1a; 由于对应最下部分的商家推荐重复&#xff0c;直接复制即可&#xff0c;在此不做过多的讲解&#xff1a; 接下来我们创建一行命名为内容&#xff0c;用以作为下半部分的容器&#xff1a; 接着我们制作第一个种…

C语言试题十七之用来求数组的最大元素在数组中的下标并存放在k所指的储存单元中

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 请编写一个…

微软AI插件Github Copilot初体验

前言上个月看到了一款插件 微软 GitHub AI 编程工具 Copilot于是就想尝尝鲜&#xff0c;但是GitHub Copilot是需要申请的&#xff0c;只有申请通过的才能使用这款插件。就在今天我收到审核通过的邮件。于是想看看这插件是不是像其它网友说的那样强&#xff01;使用于是打开了我…

Firefox about

在firefox的地址栏输入about:about,然后看一下各个链接.有的链接有具体的用途,有的链接疯言疯语,并无软用. about:about集中了火狐浏览器的全部用户界面,平时常见的preferences,startpage,add-ons等都可以在此处见到. about:mozilla是mozilla之书,它仿照圣经的语言风格,讲述了m…

关于互斥锁,条件变量的内核源码解析

一、解决问题和适用范围 主要是用来等待一个条件&#xff0c;这个条件可能需要另一个线程来满足这个条件。这个和我们平常适用的pthread_mutex_lock的最大不同在于后者保护的一般是一个代码段(也就是关键区)&#xff0c;或者一个变量&#xff0c;但是由于一般来说这个变量的访问…

【CASS精品教程】CASS 9.2绘制地籍图详细实验案例教程

文章目录 4.1 绘制地籍图4.1.1 生成平面图4.1.2 生成权属信息数据文件4.1.3 绘权属地籍图4.1.4 图形编辑4.3 绘制宗地图4.3.1 单块宗地4.3.2 批量处理4.4 绘制地籍表格4.4.1 界址点成果表4.4.2 界址点坐标表4.4.3 以街坊为单位界址点坐标表4.4.4 以街道为单位宗地面积汇总表4.4…

jquery.cookie.js 使用小结

先引入jquery&#xff0c;再引入&#xff1a;jquery.cookie.js添加一个"会话cookie"$.cookie(the_cookie, the_value);这里没有指明 cookie有效时间&#xff0c;所创建的cookie有效期默认到用户关闭浏览器为止&#xff0c;所以被称为 “会话cookie&#xff08;sessio…

Android开发 人民币符号(¥)显示不一致的问题

不小心踩了个坑&#xff0c;发现这个人民币符号在不同机器上显示不一致&#xff0c;有的显示一横&#xff0c;有的显示两横。 百度查了一下&#xff0c;找到好很多解决办法&#xff0c;改字体&#xff0c;用图片等等。 最后发现原来用的是全角的“&#xffe5;”的原因&#xf…

《iVX 高仿美团APP制作移动端完整项目》09 订单页制作

订单页制作比较简单&#xff0c;界面如下&#xff1a; 一、标题 首先创建一个页面&#xff0c;命名为订单页&#xff0c;并且给予背景色为黄色&#xff1a; 随后创建一个行&#xff0c;命名为主要并给予对应的基础属性&#xff1a; 接着给予这个主要行对应的上下内边距使其…

AutoDesk CAD 2014安装VBA Enabler图文教程(附AutoCAD_2014_VBA_Win_64bit下载)

在利用CASS将dwg地形图转为ArcGIS支持的Shapefile格式数据时,为了提高转换效率,通常我们会写一些VBA代码来实现,但是VBA不提供与AutoCAD OEM 安装介质,需要单独下载VBA环境。 Visual Basic for Applications (VBA) 引擎不再提供与 AutoCAD OEM 安装介质。 请联系您的 Auto…

C语言试题十八之根据以下攻势计算s,计算结果作为函数值返回;n通过形参传入。S=1+1/(1+2)+1/(1+2+3)+…….+1/(1+2+3+4+……+n)

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 编写函数f…

开源项目 英雄联盟 之WPF

WPF 英雄联盟作者&#xff1a;Devncore 组织 来自 韩国&#xff0c;首尔原文链接&#xff1a;https://github.com/devncore/leagueoflegends感谢分享者晨晞gg[1]&#xff1b;框架使用.NET6&#xff1b;C# 10.0;Visual Studio 2022;您可以了解如何正确实施 WPF 项目。描述了如何…

1055 最长等差数列

1055 最长等差数列基准时间限制&#xff1a;2 秒 空间限制&#xff1a;262144 KB N个不同的正整数&#xff0c;找出由这些数组成的最长的等差数列。 例如&#xff1a;1 3 5 6 8 9 10 12 13 14等差子数列包括(仅包括两项的不列举&#xff09;1 3 51 5 9 133 6 9 123 8 135 9 136…