4.0 及以后版本 Boot_COMPLETED广播不响应的问题

简介: 4.0 及以后版本 Boot_COMPLETED广播不响应的问题

请自行参阅博文:


http://blog.csdn.net/loovejava/article/details/9261907

android3.1以后,packageManager增加了对“stop state”的应用的管理,这个stopped和Activity生命周期中的stop状态是完全两码事,指的是安装后从来没有启动过和被用户手动强制停止的应用,与此同时系统增加了2个Flag:FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES ,来标识一个intent是否激活处于“stopped state”的应用。当2个Flag都不设置或者都进行设置的时候,采用的是FLAG_INCLUDE_STOPPED_PACKAGES的效果。


google给所有的广播intent默认加上FLAG_EXCLUDE_STOPPED_PACKAGES效果卓著,能在一定程度上增加安全系数,还能提高效率,但是RECEIVE_BOOT_COMPLETED广播如果用户没有运行过应用,就不会响应了。


   解决这个问题还有一种途径,google允许应用和后台服务通过给广播intent设置FLAG_INCLUDE_STOPPED_PACKAGES来唤醒处于“stopped state”的程序,也就是用户自己写的广播intent可以控制这个机制,但是系统自带的广播intent,由于不能修改,就只能接受这个现实了。



补充:


一般应用安装完后, 若用户不手动启动一次, 则会在用户在文件中保存此应用的信息:


/data/system/users/0/package-restrictions.xml


文件内容见:


<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<package-restrictions>
<pkg name="com.google.android.ears" enabled="2" />
<pkg name="com.android.contacts">
<disabled-components>
<item name="com.android.contacts.activities.DialtactsActivity" />
</disabled-components>
</pkg>
<pkg name="com.boohee.one">
<enabled-components>
<item name="com.xiaomi.push.service.XMPushService" />
</enabled-components>
</pkg>
<pkg name="com.google.android.partnersetup">
<enabled-components>
<item name="com.google.android.partnersetup.PhoneStateReceiver" />
</enabled-components>
</pkg>
<pkg name="com.anson.boot" stopped="true" nl="true" />


最后一行中stoped="true", nl="true"


nl 是 notlaunched的意思.



此文件的读写见文件:


./frameworks/base/services/java/com/android/server/pm/Settings.java



在./frameworks/base/services/java/com/android/server/pm/PackageManagerService.java


中声明了方法代外部调用:


 

public void setPackageStoppedState(String packageName, boolean stopped, int userId) {
        if (!sUserManager.exists(userId)) return;
        final int uid = Binder.getCallingUid();
        final int permission = mContext.checkCallingOrSelfPermission(
                android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE);
        final boolean allowedByPermission = (permission == PackageManager.PERMISSION_GRANTED);
        enforceCrossUserPermission(uid, userId, true, "stop package");
        // writer
        synchronized (mPackages) {
            if (mSettings.setPackageStoppedStateLPw(packageName, stopped, allowedByPermission,
                    uid, userId)) {
                scheduleWritePackageRestrictionsLocked(userId);
            }
        }
    }



如:


./frameworks/base/services/java/com/android/server/am/ActivityStack.java


final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options){
  ...
  // Launching this app's activity, make sure the app is no longer
        // considered stopped.
        try {
            AppGlobals.getPackageManager().setPackageStoppedState(
                    next.packageName, false, next.userId); /* TODO: Verify if correct userid */
        } catch (RemoteException e1) {
        } catch (IllegalArgumentException e) {
            Slog.w(TAG, "Failed trying to unstop package "
                    + next.packageName + ": " + e);
        }


相关文章
|
7月前
|
Arthas 前端开发 Java
问题排查---应用程序不在接收新请求
关键词:springboot,jstack,Arthas
71 1
|
Java Spring
spring data elasticsearch: 设置保活策略|长时间不连接es,报错超时连接
java client长时间没有连接es后,再次调用访问接口,报错连接超时
1360 0
|
5月前
|
XML Java Android开发
Android Studio App开发之监听系统广播Broadcast的讲解及实战(包括接收分钟到达广播、网络变更广播、定时管理器等 附源码)
Android Studio App开发之监听系统广播Broadcast的讲解及实战(包括接收分钟到达广播、网络变更广播、定时管理器等 附源码)
95 0
|
9月前
|
监控 前端开发
服务器发送事件(Server-Sent Events)
服务端向客户端推送消息,其实除了可以用WebSocket这种耳熟能详的机制外,还有一种服务器发送事件(Server-Sent Events),简称 SSE。这是一种服务器端到客户端(浏览器)的单向消息推送。
315 0
|
Java Android开发
Android 7.1 多次重启后BOOT_COMPLETED广播接收变慢
Android 7.1 多次重启后BOOT_COMPLETED广播接收变慢
263 0
|
存储 消息中间件 Android开发
Android源码分析--广播的注册、发送和接收
Android源码分析--广播的注册、发送和接收
248 0
Android源码分析--广播的注册、发送和接收
|
Web App开发 开发者
如何从Fiori launchpad发出的请求判断出后台是哪个网关系统在响应
我们点了Fiori launchpad后,如果想知道这个launchpad连接的后台系统是哪一个,可以通过在Chrome开发者工具观察network请求的方式弄清楚。 如下图例子,gateway系统是GM4.
如何从Fiori launchpad发出的请求判断出后台是哪个网关系统在响应
|
存储 中间件
为什么使用中间件下载时总是收到警告消息Object is in status Wait
为什么使用中间件下载时总是收到警告消息Object is in status Wait
135 1
为什么使用中间件下载时总是收到警告消息Object is in status Wait
如何处理APF框架的错误消息:Filter is too complex error
如何处理APF框架的错误消息:Filter is too complex error
143 0
如何处理APF框架的错误消息:Filter is too complex error
SAP Spartacus读取User Address的请求发送和接收源头
SAP Spartacus读取User Address的请求发送和接收源头
81 0
SAP Spartacus读取User Address的请求发送和接收源头