执行运行时安全性检查
Android中的运行时安全性检查是在进程级别和操作级别上进行的。在进程级别,Android禁止一个应用程序直接访问另一个应用程序的数据。实现方法是,每个应用程序都在不同的进程中运行,使用唯一且固定的ID。在操作级别上,Android定义了一组受保护的功能和资源。要使用应用程序能够访问此信息,必须向 AndroidManifest.xml 文件添加一个或多个权限请求。也可以为应用程序定义自定义权限。

进程边界上的安全性
在桌面环境中,大部分应用程序都使用相同的用户ID 运行,与此不同的是,Android应用程序通常使用自己的唯一ID运行。通过使用不同的ID 运行每个应用程序,Android围绕每个进程创建了一种隔离边界。这能够阻止一个应用程序直接访问另一个应用程序。
尽管每个进程都具有边界,但应用程序之间的数据共享显然也可以实现,但必须显示地进行共享。换句话说,要获得另一个应用程序的数据,必须借助该应用程序的组件。例如,可以查询另一应用程序的ContentProvider, 可以调用另一个应用程序中的活动,或者可以与另一个应用程序的服务通信。所有这些途径都提供了在应用程序之间共享信息的方法,但它们显式方式实现此目的,因为你不会访问基础数据库、文件等内容。

下面我们来 使用自定义权限
Android支持为应用程序定义自定义权限。例如,如果希望阻止某些用户启动应用程序中的某个活动(也就是某个Activity),可以定义自定义权限来实现,要使用自定义权限,首先在AndroidManifest.xml 文件中声明它们。定义了权限之后,可以将它们作为组件定义的一部分进行引用。
创建一个应用程序,其中包含一个不是所有人都允许启动的活动。要启动该活动,用户必须具有特定的权限,我们新建一个Android项目 输入 CustomPermission作为项目名称,输入 com.cust.perm最为包名称,输入 CustPermMainActivity作为活动名称 我们还得创建一个具有特殊权限才能访问的 Activity 名字是 PrivActivity,下面使我们的 PrivActivity类。
Java代码
  1. packagecom.cust.perm;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.view.ViewGroup.LayoutParams;
  5. importandroid.widget.LinearLayout;
  6. importandroid.widget.TextView;
  7. publicclassPrivActivityextendsActivity{
  8. @Override
  9. protectedvoidonCreate(BundlesavedInstanceState){
  10. super.onCreate(savedInstanceState);
  11. LinearLayoutview=newLinearLayout(this);
  12. view.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,
  13. LayoutParams.WRAP_CONTENT));
  14. view.setOrientation(LinearLayout.HORIZONTAL);
  15. TextViewnameLbl=newTextView(this);
  16. nameLbl.setText("HellofromPrivActivity");
  17. view.addView(nameLbl);
  18. setContentView(view);
  19. }
  20. }


这是一个灰常正常的Activity,我们要展示的是如果使用权限保护此activity,然后我们从客户端调用它,如果调用成功 我们就会在屏幕上看到 我们定义的文本 “Hello from PrivActivity” 下面我们来给这个activity 创建权限,灰常简单了,找到我们的AndroidManifest.xml文件 点击Permissions 然后 Add 来张图。



图一看大家就明白了权限具有 名称、标签、图标、权限组、描述和保护级别 这些属性。
这个就不都解释了,挑2个解释,大家可以去看看文档,虽然我也看不懂。
android:name 必须有 权限的名称。通常应该尊选Android的命名方案 (*.permission.*)
android:protectionLevel 必须有 定义权限的风险级别,必须是以下值之一:
notmal、 dangerous、signature、signatureOrSystem normal表示权限是低风险的,不会对系统、用户或其他应用程序造成危害。

现在已经有了自定义权限。接下来需要告诉系统,PrivActivity 活动应该仅由具有 syh.permission.STARTMYACTIVITY 权限的应用程序启动。要在活动上设置必需的权限,可以将 android:permission 特性添加到 AndroidManifest.xml中的活动定义中。为了能启动活动,还需要想activity 添加一个Intent过滤器,下面是我们的 AndroidManifest.xml文件。
Xml代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.cust.perm"android:versionCode="1"
  4. android:versionName="1.0">
  5. <applicationandroid:icon="@drawable/icon"
  6. android:label="@string/app_name">
  7. <activityandroid:name=".CustPermMainActivity"
  8. android:label="@string/app_name">
  9. <intent-filter>
  10. <actionandroid:name="android.intent.action.MAIN"/>
  11. <category
  12. android:name="android.intent.category.LAUNCHER"/>
  13. </intent-filter>
  14. </activity>
  15. <activityandroid:name="PrivActivity"
  16. android:permission="syh.permission.STARTMYACTIVITY">
  17. <intent-filter>
  18. <actionandroid:name="android.intent.action.MAIN"/>
  19. <category
  20. android:name="android.intent.category.LAUNCHER"/>
  21. </intent-filter>
  22. </activity>
  23. </application>
  24. <uses-sdkandroid:minSdkVersion="9"/>
  25. <permissionandroid:description="@string/startMyActivityDesc"
  26. android:label="StartMyActivity"
  27. android:name="syh.permission.STARTMYACTIVITY"
  28. android:protectionLevel="normal">
  29. </permission>
  30. </manifest>


我们的权限描述属性 android:description 引用了字符串资源 所以我们还得向 strings.xml添加一个字符串常量,如下:
Xml代码
  1. <stringname="startMyActivityDesc">Allowstartingmyactivity</string>


好了我们现在来编写客户端,我们将在客户端中 访问刚才我们定义的具有特殊权限才能访问的Activity。新建项目 ClientOfCustomPermission 我们定义了一个按钮,当我们点击按钮就会访问那个具有特殊权限才能访问的 activity,下面是我们客户端的布局文件。
Xml代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <Button
  8. android:id="@+id/btn"
  9. android:text="LauchPrivActivity"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. />
  13. </LinearLayout>


运行效果





下面来看看我们的 ClientCustPermMainActivity类, 也没有什么特别的 就是我们需要在客户端的 AndroidManifest.xml文件中声明我们的访问权限 如下。
Java代码
  1. packagecom.client.cust.perm;
  2. importandroid.app.Activity;
  3. importandroid.content.Intent;
  4. importandroid.os.Bundle;
  5. importandroid.view.View;
  6. importandroid.view.View.OnClickListener;
  7. importandroid.widget.Button;
  8. publicclassClientCustPermMainActivityextendsActivity{
  9. @Override
  10. publicvoidonCreate(BundlesavedInstanceState){
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.main);
  13. Buttonbtn=(Button)findViewById(R.id.btn);
  14. btn.setOnClickListener(newOnClickListener(){
  15. @Override
  16. publicvoidonClick(Viewv){
  17. Intentintent=newIntent();
  18. //通过指定包名来启动我们想要启动的Activity注意第二个参数是完全限定包名
  19. intent.setClassName("com.cust.perm",
  20. "com.cust.perm.PrivActivity");
  21. startActivity(intent);
  22. }
  23. });
  24. }
  25. }


我们添加了 uses-permission 项来请求自定义权限,具有该权限才能启动在 CustomPermission 项目中实现的 PrivActivity,然后我们运行 客户端,在这里 我要弱弱的提醒大家一下,由于我们是在 我们的客户端 去访问另外一个项目中的 具有特殊权限的activity,不是如访问服务 所以我们的另一个项目 也就是CustomPermission必须先运行,然后再运行我们的客户端,不然 是访问不了滴。

更多相关文章

  1. android 加速度传感器妙用与自定义View
  2. android 5.0 新特性之最近应用程序
  3. Mac系统配置Android(安卓)Studio的gradle命令
  4. 从零开始--系统深入学习android(实践-让我们开始写代码-Android框
  5. 让你自己编写的Android的Launcher成为系统中第一个启动应用程序
  6. Android文件访问权限
  7. 自定义区间滑动取值控件
  8. 转换 iOS 用户界面到 Android(安卓)的 5 大要诀
  9. Android中分页滑动实现总结

随机推荐

  1. Android如何平移一个View
  2. android:launchMode="singleTask" 与 onN
  3. Android(安卓)webkit 事件传递流程
  4. android 开发中判断网络是否连接的代码
  5. android 启动页与数据保存
  6. android Button 颜色的变化(点击,放开,点击
  7. Android(安卓)中常用的五种布局
  8. manifest中的 android:name
  9. android 图片双缓存,开源框架 universali
  10. 如何检查后台服务(Android的Service类)是否