- 浏览: 2144955 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
导读:我们以如何抢先开机启动为例,来说明接收无序广播的静态广播接收器的接收顺序
(注意,文本只是陈述结果,所以叫结果篇,之后的文章再给出源码分析)
首先先说一下android中的广播和广播接收器
广播可以分为有序、无序和sticky共三种
广播接收器可以分为静态和动态两种
首先我们要明确两个问题
1.接收无序广播的接收器接收到广播的顺序是有序的
2.接收无序广播的接收器也一样可以设置优先级的
这里主要说一下多个应用中的静态广播接收器(优先级都相同的情况下 )接收无序广播时的接收顺序
注意:这里主要描述结论,具体原理后续给出
注意:本文在提及的同时出现在同一设备的静态接收器默认具有相同的优先级,这点很重要
我们以开机时候发出的广播android.intent.action.BOOT_COMPLETED为例,这是个无序广播
如果应用想要开启自启动,那么就要监听这个广播,程序启动之前,动态广播接收器肯定是无法使用的,我相信大家对此没有什么疑问
如果先接收到,那么程序就会先启动,至于先启动的优势,我想那些迫不及待的人比谁都清楚
接收顺序到底与什么有关,说实话,我也不清楚,不过先别急着拍我,我也不是完全不知道……
顺序与解析应用的顺序是一致的,但是解析应用的顺序是怎样的呢?
首先要告诉大家的是,这和你apk的文件名没有关系!
比如a.apk、b.apk两个应用,结果并不能保证a能比b先接收到,或者b能比a先接收到
然后告诉大家,这和apk的文件名有关系!
没错,但是为什么这么说?
用户安装一个应用有这么几个步骤
1下载一款应用,假设下载下来的时候这个应用叫new.apk
2安装。一般情况下,用户会在手机中操作,点击文件,然后系统会安装页面……然后大家都知道。另一种情况程序猿可能喜欢使用adb install -r new.apk
大家都知道,第三方应用会存放在/data/app目录下
当安装完毕之后,我们去这里看看,发现一个严峻的问题,那就是,你找不到一个叫new.apk的文件!
那你会找到什么?你会找到一个文件,他的名字是以与new.apk这个应用包名开始的,然后可能会跟着"-数字.apk",比如:com.android.test-1.apk
接收的顺序与这个名字是有关的!那么关系是怎样的呢?
系统在开机的时候,会按着一个顺序解析apk
1.首先,会解析手机中的/system/framework这个目录,原生系统中,这下面就一个apk - framework-res.apk
当然各个厂商也会加入自己的内容,比如我的这个目录下就有com.htc.resources.apk
2.然后受到重视的文件夹按顺序分别为:
/system/app
/vendor/app
/data/app
/drm/app-private
(代码分析在下一篇博客给出)
那么每个文件夹下解析的顺序是怎样的呢
我们先只看/data/app,也就是用户安装的第三方应用的存放位置
这与下面代码返回结果的顺序是一致的
也就是说,我们按顺序打印这个数组,就能知道哪个接收器会先接收到这个广播,哪个会后接收到(为什么与这个结果一致,下篇文章分析)
(记住:本文默认说的这些接收器假设具有相同的优先级,如果优先级不同,当然是高优先级的先接收到)
现在大家可能有这么几个疑问:
1.String[] java.io.File.list(),这个函数的返回结果是怎样的顺序呢?
2.如何执行上面那段代码呢?
首先回答问题1
我不知道!
我们来看看javadoc给出的说明
说的很清楚,人家不给你任何保证
听说在windows下执行的时候,结果会按着字母顺序排列,可惜,android是linux
但是我们可以耍赖,打印一下上面结果,如果自己的应用拍在后面,就改包名,直到你能排到前面,当然这不是什么好办法,但我也没有什么更好的办法了
现在回答问题2
执行这段代码需要root权限,因为一般应用是没有这个目录的读取权限的
如果手机没有root怎么办?你不会找一个root过的来查看结果吗……
我做了一个实验,我写了几个只有receiver的应用,把他们的包名分别设置为大家常用的、关系的应用包名
飞信:cn.com.fetion
LBE隐私卫士:com.lbe.security.lite
Handsent:com.handsent.nextsms
金山手机卫士:com.ijinshan.mguard
360手机卫士:com.qihoo360.mobilesafe
QQ手机管家:com.tencent.qqpimsecure
一个测试应用:com.example.boottest
结果为:
/data/app/:files[8]:com.tencent.qqpimsecure-1.apk
/data/app/:files[9]:com.qihoo360.mobilesafe-1.apk
/data/app/:files[10]:com.ijinshan.mguard-1.apk
/data/app/:files[11]:cn.com.fetion-1.apk
/data/app/:files[12]:com.lbe.security.lite-1.apk
/data/app/:files[13]:com.handsent.nextsms-1.apk
/data/app/:files[14]:com.example.boottest-1.apk
实际接收顺序为:
12-06 15:19:58.187: I/System.out(1880): getPackageName:com.tencent.qqpimsecure
12-06 15:19:58.288: I/System.out(1893): getPackageName:com.qihoo360.mobilesafe
12-06 15:19:58.378: I/System.out(1906): getPackageName:com.ijinshan.mguard
12-06 15:19:58.488: I/System.out(1920): getPackageName:cn.com.fetion
12-06 15:19:58.608: I/System.out(1933): getPackageName:com.lbe.security.lite
12-06 15:19:58.718: I/System.out(1946): getPackageName:com.handsent.nextsms
12-06 15:19:58.908: I/System.out(1959): getPackageName:com.example.boottest
如果其中一个优先级较高,比如cn.com.fetion,那么实际的接收顺序为
getPackageName:cn.com.fetion
getPackageName:com.tencent.qqpimsecure
getPackageName:com.qihoo360.mobilesafe
getPackageName:com.ijinshan.mguard
getPackageName:com.lbe.security.lite
getPackageName:com.handsent.nextsms
getPackageName:com.example.boottest
最后注意:
上面只是一个简单测试,并不是这些应用就是按着这个顺序,因为他们优先级也许不一致,也许在/data/app下的文件名不一致,导致顺序不一致
不过,看到这里,你应该知道如何去先于他们开机启动了
(注意,文本只是陈述结果,所以叫结果篇,之后的文章再给出源码分析)
首先先说一下android中的广播和广播接收器
广播可以分为有序、无序和sticky共三种
广播接收器可以分为静态和动态两种
首先我们要明确两个问题
1.接收无序广播的接收器接收到广播的顺序是有序的
2.接收无序广播的接收器也一样可以设置优先级的
这里主要说一下多个应用中的静态广播接收器(优先级都相同的情况下 )接收无序广播时的接收顺序
注意:这里主要描述结论,具体原理后续给出
注意:本文在提及的同时出现在同一设备的静态接收器默认具有相同的优先级,这点很重要
我们以开机时候发出的广播android.intent.action.BOOT_COMPLETED为例,这是个无序广播
如果应用想要开启自启动,那么就要监听这个广播,程序启动之前,动态广播接收器肯定是无法使用的,我相信大家对此没有什么疑问
如果先接收到,那么程序就会先启动,至于先启动的优势,我想那些迫不及待的人比谁都清楚
接收顺序到底与什么有关,说实话,我也不清楚,不过先别急着拍我,我也不是完全不知道……
顺序与解析应用的顺序是一致的,但是解析应用的顺序是怎样的呢?
首先要告诉大家的是,这和你apk的文件名没有关系!
比如a.apk、b.apk两个应用,结果并不能保证a能比b先接收到,或者b能比a先接收到
然后告诉大家,这和apk的文件名有关系!
没错,但是为什么这么说?
用户安装一个应用有这么几个步骤
1下载一款应用,假设下载下来的时候这个应用叫new.apk
2安装。一般情况下,用户会在手机中操作,点击文件,然后系统会安装页面……然后大家都知道。另一种情况程序猿可能喜欢使用adb install -r new.apk
大家都知道,第三方应用会存放在/data/app目录下
当安装完毕之后,我们去这里看看,发现一个严峻的问题,那就是,你找不到一个叫new.apk的文件!
那你会找到什么?你会找到一个文件,他的名字是以与new.apk这个应用包名开始的,然后可能会跟着"-数字.apk",比如:com.android.test-1.apk
接收的顺序与这个名字是有关的!那么关系是怎样的呢?
系统在开机的时候,会按着一个顺序解析apk
1.首先,会解析手机中的/system/framework这个目录,原生系统中,这下面就一个apk - framework-res.apk
当然各个厂商也会加入自己的内容,比如我的这个目录下就有com.htc.resources.apk
2.然后受到重视的文件夹按顺序分别为:
/system/app
/vendor/app
/data/app
/drm/app-private
(代码分析在下一篇博客给出)
那么每个文件夹下解析的顺序是怎样的呢
我们先只看/data/app,也就是用户安装的第三方应用的存放位置
这与下面代码返回结果的顺序是一致的
File file = new File("/data/app/"); String[] files = file.list();
也就是说,我们按顺序打印这个数组,就能知道哪个接收器会先接收到这个广播,哪个会后接收到(为什么与这个结果一致,下篇文章分析)
(记住:本文默认说的这些接收器假设具有相同的优先级,如果优先级不同,当然是高优先级的先接收到)
现在大家可能有这么几个疑问:
1.String[] java.io.File.list(),这个函数的返回结果是怎样的顺序呢?
2.如何执行上面那段代码呢?
首先回答问题1
我不知道!
我们来看看javadoc给出的说明
There is no guarantee that the name strings in the resulting array will appear in any specific order; they are not, in particular, guaranteed to appear in alphabetical order.
说的很清楚,人家不给你任何保证
听说在windows下执行的时候,结果会按着字母顺序排列,可惜,android是linux
但是我们可以耍赖,打印一下上面结果,如果自己的应用拍在后面,就改包名,直到你能排到前面,当然这不是什么好办法,但我也没有什么更好的办法了
现在回答问题2
执行这段代码需要root权限,因为一般应用是没有这个目录的读取权限的
如果手机没有root怎么办?你不会找一个root过的来查看结果吗……
我做了一个实验,我写了几个只有receiver的应用,把他们的包名分别设置为大家常用的、关系的应用包名
飞信:cn.com.fetion
LBE隐私卫士:com.lbe.security.lite
Handsent:com.handsent.nextsms
金山手机卫士:com.ijinshan.mguard
360手机卫士:com.qihoo360.mobilesafe
QQ手机管家:com.tencent.qqpimsecure
一个测试应用:com.example.boottest
File file = new File("/data/app/"); String[] files = file.list(); for (int i = 0; i < files.length; i++) { System.out.println("/data/app/:files["+(i+1)+"]:" + files[i]); }
结果为:
/data/app/:files[8]:com.tencent.qqpimsecure-1.apk
/data/app/:files[9]:com.qihoo360.mobilesafe-1.apk
/data/app/:files[10]:com.ijinshan.mguard-1.apk
/data/app/:files[11]:cn.com.fetion-1.apk
/data/app/:files[12]:com.lbe.security.lite-1.apk
/data/app/:files[13]:com.handsent.nextsms-1.apk
/data/app/:files[14]:com.example.boottest-1.apk
实际接收顺序为:
12-06 15:19:58.187: I/System.out(1880): getPackageName:com.tencent.qqpimsecure
12-06 15:19:58.288: I/System.out(1893): getPackageName:com.qihoo360.mobilesafe
12-06 15:19:58.378: I/System.out(1906): getPackageName:com.ijinshan.mguard
12-06 15:19:58.488: I/System.out(1920): getPackageName:cn.com.fetion
12-06 15:19:58.608: I/System.out(1933): getPackageName:com.lbe.security.lite
12-06 15:19:58.718: I/System.out(1946): getPackageName:com.handsent.nextsms
12-06 15:19:58.908: I/System.out(1959): getPackageName:com.example.boottest
如果其中一个优先级较高,比如cn.com.fetion,那么实际的接收顺序为
getPackageName:cn.com.fetion
getPackageName:com.tencent.qqpimsecure
getPackageName:com.qihoo360.mobilesafe
getPackageName:com.ijinshan.mguard
getPackageName:com.lbe.security.lite
getPackageName:com.handsent.nextsms
getPackageName:com.example.boottest
最后注意:
上面只是一个简单测试,并不是这些应用就是按着这个顺序,因为他们优先级也许不一致,也许在/data/app下的文件名不一致,导致顺序不一致
不过,看到这里,你应该知道如何去先于他们开机启动了
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 567本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1025颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 925从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1032Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 901Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 765前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 853监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 728在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 826最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1225##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 998当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 676setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1402问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 679底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1661点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1289import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2199TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1447一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 790Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 887最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
android开机启动android开机启动service android开机启动android开机启动service android开机启动android开机启动service android开机启动android开机启动service
因项目需要,综合网上资源,对android开机启动速度优化的一些总结
Android应用程序可以实现开机时启动相关应用 如service等 Android系统在开机启动时会发出一个系统广播"android intent action BOOT COMPLETED" 在接收到这个广播就可以实现开机自启动功能 下面就是一个...
Android 开机自启动应用, BOOT_COMPLETED
可以实现手机开机重启的时候自启动,程序简单易懂,有注释,是利用广播实现的
Android 开机启动, 设置开机启动选项。
【Android】开机自启动Demo 相关文章:http://blog.csdn.net/etzmico/article/details/6848465
现在大多数的android手机系统都默认禁止第三方安装的APP开机自启动,只有系统APP(system/app)才默认有这个权限,所以一般都需要去安全中心或者手机管家中去设置为允许。这里说个题外话,手机软件除非特殊情况,不然...
android开机启动服务代码。开机启动进行android录音。实现android的后台录音。
delphi XE6 android 开机启动代码,开机应用程序启动
Android_开机启动流程Android_开机启动流程
android最好的开机自启动项管理软件,软件暂用资源小,功能强大,绿色无广告~~极力推荐
Android应用开机自动启动代码Demo,下载后直接放在Android Studio里运行就可以
【Android】开机自启动Service Demo 相关文章链接:http://blog.csdn.net/etzmico/article/details/7317695
通过java 代码执行liunx系统命令并获取返回参数。 在android系统启动完成后,接受开机完毕启动广播,保存在share文件中。完成开机启动时间的记录。
Delphi下 Android 开机启动代码,可直接应用于项目。
实现android开机自启动,用广播实现自启动
android开机启动程序源码
该程序基于android平台可以实现开机自动启动录音 并且将录音存储在当前存储目录下