广播注册和添加权限过滤广播

时间:2022-11-18 22:31:52

android的权限级别:
通常情况下,对于需要付费的操作以及可能涉及到用户隐私的操作,我们都会格外敏感。
出于上述考虑以及更多的安全考虑,Android中对一些访问进行了限制,如网络访问(需付费)以及获取联系人(涉及隐私)等。应用程序如果想要进行此类访问,则需要申请相应权限。Android对这些权限进行了四类分级,不同级别的权限对应不同的认证方式。

normal:低风险权限,只要申请了就可以使用(在AndroidManifest.xml中添加标签),安装时不需要用户确认;
dangerous:高风险权限,安装时需要用户的确认才可使用;
signature:只有当申请权限的应用程序的数字签名与声明此权限的应用程序的数字签名相同时(如果是申请系统权限,则需要与系统签名相同),才能将权限授给它;
signatureOrSystem:签名相同,或者申请权限的应用为系统应用(在system image中)。

上述四类权限级别同样可用于自定义权限中。如果开发者需要对自己的应用程序(或部分应用)进行访问控制,则可以通过在AndroidManifest.xml中添加标签,将其属性中的protectionLevel设置为上述四类级别中的某一种来实现。

两种注册类型的区别是:

1)第一种不是常驻型广播,也就是说广播跟随activity的生命周期。注意: 在activity结束前,移除广播接收器。
2)第二种是常驻型,也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。

在android下,要想接受广播信息,那么这个广播接收器就得我们自己来实现了,我们可以继承BroadcastReceiver,就可以有一个广播接受器了。有个接受器还不够,我们还得重写BroadcastReceiver里面的onReceiver方法

1.常驻型广播,也是静态广播
在AndroidManifest.xm里面配置

<uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />
<permission
android:name="com.cn.customview.permissions.MY_BROADCAST">

</permission>

<receiver android:name=".MyBroadCastReceiver ">
<intent-filter android:priority="20">
<action android:name="android.provider.Telephony.MYRECEIVED"/>
</intent-filter>
</receiver>
public class MyBroadCastReceiver extends BroadcastReceiver 
{

@Override
public void onReceive(Context context, Intent intent)
{
Toast.makeText(context, "测试广播", Toast.LENGTH_SHORT).show();
//终止广播
abortBroadcast();
}
}

发送广播时

private String permission = "com.cn.customview.permissions.MY_BROADCAST";
Intent intent = new Intent();
intent.putExtra("demo", "这是一个测试方法");
sendBroadcast(intent, permission);

2.不是常驻型,动态注册广播
在AndroidManifest.xm里面配置

  <uses-permission android:name="com.cn.customview.permissions.MY_BROADCAST" />
<permission
android:name="com.cn.customview.permissions.MY_BROADCAST">

</permission>
public class MainActivity extends AppCompatActivity {

private TextView text;
private Button button;
private String permission = "com.cn.customview.permissions.MY_BROADCAST";
private String action = "com.cn.customview.permissions.my_broadcast";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = ((TextView) findViewById(R.id.text));
button = ((Button) findViewById(R.id.button));
//实例化过滤器并设置要过滤的广播
IntentFilter filter = new IntentFilter();
//过滤动作
filter.addAction(action);
filter.setPriority(100);//优先级设置
//注册广播接受者
registerReceiver(myReceiver, filter, permission, null);

button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("demo", "这是一个测试方法");
intent.setAction(action);
//设置要收到广播所需要的权限
sendBroadcast(intent, permission);
}
});
}
private BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String demo = intent.getStringExtra("demo");
text.setText(demo);
}
};
}

注意:
1.registerReceiver(receiveBroadCast,filter,BROADCAST_PERMISSION_DISC,null);
如果改为registerReceiver(receiveBroadCast, filter);照样能够收到第三步发送的消息,
因为我们在xml里面已经申请了BROADCAST_PERMISSION_DISC权限,所以sendBroadcast(intent,BROADCAST_PERMISSION_DISC);发送广播我们依然能收到。
2.sendBroadcast(intent,BROADCAST_PERMISSION_DISC);
改为sendBroadcast(intent);也同样能收到这个消息。
因为第一个的意思是收到这个消息的广播监听器必须有BROADCAST_PERMISSION_DISC权限,如果第二个参数去掉,则说明广播监听器不需要任何权限就能收到这个消息。