文档章节

Manifest中<android:enabled>和<android:exported>标签

Dio_V
 Dio_V
发布于 2015/12/07 00:45
字数 951
阅读 638
收藏 0

晚上敲代码的时候,在一个Activity中给按钮添加点击事件,希望实现开启/关闭服务的功能。但是服务死活开启不了。反反复复检查了很多遍,Activity中的代码肯定是没有问题的。

settingBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(), AntiService.class);
                if (ServiceTool.getServiceState(getApplicationContext(), "com.example.dio.service.AntiService")) {//如果已经打开了,就将按钮关闭,并且关闭服务
                    stopService(intent);
                    settingBtn.setSelected(false);
                } else {//如果没有打开,将按钮打开,并且开启服务
                    startService(intent);
                    settingBtn.setSelected(true);
                }
            }
        });

最后才发现原来是在Manifest.xml文件中给Service下的enable和exported两个标签的设置问题。

下面是官方文档对这两个标签的解释:

android:enabled Whether or not the broadcast receiver can be instantiated by the system — "true" if it can be, and "false" if not. The default value is "true".
The <application> element has its own enabled attribute that applies to all application components, including broadcast receivers. The <application> and <receiver> attributes must both be "true" for the broadcast receiver to be enabled. If either is "false", it is disabled; it cannot be instantiated.

android:exported Whether or not components of other applications can invoke the service or interact with it — "true" if they can, and "false" if not. When the value is "false", only components of the same application or applications with the same user ID can start the service or bind to it.
The default value depends on whether the service contains intent filters. The absence of any filters means that it can be invoked only by specifying its exact class name. This implies that the service is intended only for application-internal use (since others would not know the class name). So in this case, the default value is "false". On the other hand, the presence of at least one filter implies that the service is intended for external use, so the default value is "true".
This attribute is not the only way to limit the exposure of a service to other applications. You can also use a permission to limit the external entities that can interact with the service (see the permission attribute).

简单翻译一下

android:enabled 定义服务能否被系统实例化的标签,true表示可以实例化,false不能实例化,默认为true
<application>标签也有enabled标签,这个标签适用于application下所有组件。只有当<application>和<service>下enabled标签的属性都为true的时候,才可以将广播接受者启动(enabled),否则广播接受者不能开启(disabled),不能被实例化。

android:exported 定义服务能否被外部应用的组件调用或者交互,true表示可以,false表示不能。如果设置为false,服务只能接收本应用的组件或者是具有相同用户ID的应用所发出的所开启或绑定。
exported标签的默认属性根据该广播接受者是否有intent filter决定。如果没有定义任何intent filter,那么该服务只能由指定准确的类名(完整类名)的intent对象所调用,这就意味着服务只能在应用内部使用(因为其他应用通常不能获取到完整类名)。这种情况下,默认值就是false。而当服务中存在至少一个intent filter时,就意味着其可以在外部被调用,所以默认值就是true
这个标签的属性并不是限制服务对外暴露的唯一方式,通过权限(permission)也可以实现。

除了service,receiver也有这两个标签,分别对应的是能否被实例化和能否接受外部消息。

因为之前一开始用eclipse的时候,添加服务并不会提示这两个标签,应该都是默认的。后来用Android Studio,当在应用中创建BroadReceiver的时候,会默认的在Manifest.xml中注册并且添加这两个标签。之前因为没有关注过着两个标签,所以一直默认的。这次不知道什么时候都设置成了false,所以才会无法创建这个服务。

还是平时文档看的不够仔细,学习Android还有很长的路要走。

© 著作权归作者所有

Dio_V
粉丝 1
博文 6
码字总数 6746
作品 0
程序员
私信 提问
Xamarin,mono for android 用一个APP启动其他隐藏应用程序

花费了好几个小时测试最终搞定了,Mono for android用一个APP启动其他隐藏应用程序。 直接看代码: 隐藏APP(被启动)要在manifest文件配置如下,去除原本的两个标签,修改成只有一个data <A...

littleluoron
2015/04/02
0
0
[无线] AndroidManifest.xml配置文件详解

AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。 从以上示例...

长平狐
2012/11/19
75
0
AndroidManifest.xml配置详解

AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。 [html]vi...

蓝狐乐队
2013/12/07
0
0
AndroidManifest.xml API

AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。 [html] v...

顶层设计
2012/10/23
0
0
AndroidManifest.xml配置文件详解

AndroidManifest.xml配置文件对于Android应用开发来说是非常重要的基础知识,本文旨在总结该配置文件中重点的用法,以便日后查阅。下面是一个标准的AndroidManifest.xml文件样例。 [html] v...

sflfqx
2015/01/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

所以说这才是Redis进化史吗?看Redis是如何变成最强缓存的

写在前面:笔者翻阅了很多资料,只能找到Redis2.2及以后的主要版本的发布日志。所以,让我们从2.2开始一步一步深入了解Redis。 2.2 redis-cli命令非常大的改进: Tab补全,支持help(例如help ...

Java干货分享
59分钟前
7
0
manjaro抽风,/usr/lib/modules目录丢失

现象 2019年6月16日这周,突然发现manjaro抽风: 先是启动时无法加载一些内核模块,导致启动失败 然后用启动盘重新pacman -S linux,第一次启动是好的,再启动就有问题了 原因 翻来覆去搞不定...

chuqq
今天
5
0
MyClouds-2.0-RC 发布,企业级微服务平台

MyClouds企业级微服务平台 MyClouds-V2.0-RC 已发布。 更新如下 [优化] 重构了系统架构。(移除myclouds-admin-webserver工程,停用后端thymeleaf模版引擎,前后端彻底分离;移除了myclouds-...

xiongchun
今天
1
0
Wine-Staging 4.9 发布,增添一些新补丁

Wine-Staging的工作还在继续,到4.9版为止,在上游Wine代码库上有超过830个补丁。 在上周五的Wine 4.9发布之后,Wine-Staging 4.9已经发布了,之前的一些暂存工作现在围绕Windows编解码器和D...

linuxCool
今天
2
0
JAVA8新特性(吐血整理)

一、Java 8 Lambda 表达式 Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 使用Lambda 表达式可以...

天王盖地虎626
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部