今天学习android总结:
1:下载adt时(adt-bundle-windows-x86_64-20140702)后,倒入的 工程出错,纠结半天,原来是语法问题,
2:android:exported
这个属性用于指示该服务是否能够被其他应用程序组件调用或跟它交互。如果设置为true,则能够被调用或交互,否则不能。设置为false时,只有同一个应用程序的组件或带有相同用户ID的应用程序才能启动或绑定该服务。
它的默认值依赖与该服务所包含的过滤器。没有过滤器则意味着该服务只能通过指定明确的类名来调用,这样就是说该服务只能在应用程序的内部使用(因为其他外部使用者不会知道该服务的类名),因此这种情况下,这个属性的默认值是false。另一方面,如果至少包含了一个过滤器,则意味着该服务可以给外部的其他应用提供服务,因此默认值是true。
这个属性不是限制把服务暴露给其他应用程序的唯一方法。还可以使用权限来限制能够跟该服务交互的外部实体。
3:第2点提到的,通过权限加以限制。
Android是一种特权分隔的操作系统,在Android上运行的每个应用程序都具有各自独立的系统标识(Linux用户ID和组ID)。系统各部分有不同的身份标识。因此,Linux上运行的各个应用程序相互独立且与系统无关。
Android的“权限许可”机制通过限定特定的进程能够执行的指定操作和限定对每一个资源点对点的访问的URI许可来提供附加细粒度的安全功能。
由于内核让每个应用程序运行在独立的沙盒中,应用程序必须通过声明所需要而沙盒没有提供的权限来明确的分配资源和数据。Android没有采用会使用户体验复杂并且不利于安全的动态授权机制。应用程序静态的声明他们所需要的权限,在程序安装时Android系统会提示用户同意它们获取这些权限。
Android权限模型是基于如下两个目标而设计的:
通过列出应用程序可能执行的所有敏感的操作,让用户更多地意识到安装这个应用存在的潜在风险。这假定用户会阅读在安装时弹出的权限列表,并基于这些信息来作出是否安装应用的决定。
降低风险:
通过限制应用程序访问Android系统敏感的API接口,来降低应用程序对整个系统带来的伤害(比如病毒)
Android权限被分为四个等级:
普通级:
这些权限并不能真正伤害到用户(比如更换壁纸),当程序需要这些权限是,开发者不需要指定程序会自动赋予这些权限。
危险级:
这些权限可能会带来真的伤害(比如打电话,打开网络链接等),如果要使用它们需要开发者在AndroidManifest.xml中声明对应的权限。
签名级:
如果应用使用的是相同的签名证书时,这些权限会自动授予给声明或者创建这些权限的程序。设计这一层级权限的目的是方便组件间数据共享。
签名/系统级:
和签名级一样,例外的是系统镜像是自动获取这些权限的,这一层级是专为设备制造商设计的。
在开发Android应用程序的过程中,如果我们要使用系统的某些服务(比如网络、待机、读写文件权限等)都需要首先像下面这样在AndroidManifest.xml中声明对应的权限,然后才可以在代码中访问这些服务:
<!-- 文件读写权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- 访问网络的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<!-- 屏幕唤醒权限 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
同样,除了能够使用Android系统提供的各种权限外,我们还可以自定义权限来限制其它程序访问应用的各种服务或者组件。任何程序想要和此程序的组件交互时,都需要声明相应的权限时才能成功地访问。
自定义权限步骤如下:
以为一个服务CalledService定义访问权限为例,具体步骤如下:
1、在被调用程序Called的AndroidManifest.xml文件中作如下定义:
<!-- Service Permission -->
<permission
android:name="com.uperone.permission.SERVICE"
android:label="@string/app_name"
android:permissionGroup="@string/app_name"
android:protectionLevel="normal" >
</permission>
关于各标签属性的意义自行脑补,都是见名知意。
<service
android:name="com.uperone.called.service.CalledService"
android:permission="com.uperone.permission.SERVICE">
<intent-filter>
<action android:name="com.uperone.action.SERVICE" />
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</service>
2、 在需要调用该组件的应用程序Call工程的AndroidManifest.mxl文件中声明对应的权限:
<uses-permission android:name="com.uperone.permission.SERVICE" />
3、在需要调用该组件的应用程序Call工程中启动、停止改服务:
case R.id.startServiceBtnId:{
Intent intent = new Intent( "com.uperone.action.SERVICE" );
startService(intent);
}
break;
特别注意: 如果在调用需要权限的组件时没有在Manifest.xml中声明权限,则会在运行对应代码段时报异常!!!!
注意:
<uses-permission android:name="com.uperone.permission.SERVICE" /> 可以使用的外部权限
<permission android:name="com.uperone.permission.SERVICE" /〉 可以提供给外部的权限