android 理解和使用自定义权限
先扯几句别的
执行运行时安全性检查
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类。
package com.cust.perm;import android.app.Activity;import android.os.Bundle;import android.view.ViewGroup.LayoutParams;import android.widget.LinearLayout;import android.widget.TextView;public class PrivActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);LinearLayout view = new LinearLayout(this);view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));view.setOrientation(LinearLayout.HORIZONTAL);TextView nameLbl = new TextView(this);nameLbl.setText("Hello from PrivActivity");view.addView(nameLbl);setContentView(view);}}
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.cust.perm" android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon"android:label="@string/app_name"><activity android:name=".CustPermMainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><categoryandroid:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name="PrivActivity"android:permission="syh.permission.STARTMYACTIVITY"><intent-filter><action android:name="android.intent.action.MAIN" /><categoryandroid:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application><uses-sdk android:minSdkVersion="9" /><permission android:description="@string/startMyActivityDesc"android:label="Start My Activity"android:name="syh.permission.STARTMYACTIVITY"android:protectionLevel="normal"></permission></manifest>
<string name="startMyActivityDesc">Allow starting my activity</string>
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><Buttonandroid:id="@+id/btn"android:text="Lauch PrivActivity"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>


package com.client.cust.perm;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class ClientCustPermMainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);Button btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();// 通过指定包名来启动我们想要启动的 Activity 注意第二个参数是完全限定包名intent.setClassName("com.cust.perm","com.cust.perm.PrivActivity");startActivity(intent);}});}}