前言:
sendBroadcast()可用来发送广播,关于广播的接收,第一种方法是通过registerReceiverr()动态进行注册广播,
第二种方法就是静态地在清单文件中去声明一个广播
Note:
如果你通过registerReceiverr()在Activity.onResume()方法体中注册广播,那么相应地你应该在Activity.onPause()方法中
将这个注册的广播记得销毁掉;
需要知道的是:尽管intent被用来发送和接收广播,但是intent的广播机制和被用来启动一个activity的intent,两者是完全独立的;
安全:
1>
intent是全局的命名空间,确保intent的action和其他字符串都是以你自己的命名空间来命名的,否则的话,可能会造成与其他应用的冲突;
2>
当你使用registerReceiver(BroadcastReceiver, IntentFilter)的时候,任何一个应用都可能会发送广播给这个注册的广播接收者,你可以
通过在下边描述的一些权限来控制谁可以发送广播给这个广播接收者;
3>
当你通过清单文件去声明一个广播接收者且通过intent-filters去指定一个特定类型的广播时,任何一个应用都可以发送广播给这个广播接收者,
无论这个被指定的intent-filters多么的特殊化;为了阻止外部的应用可以发送广播给这个广播接收者,你可以通过android:exported=false来阻止
外部应用的广播对被应用广播接收者的干扰;
4>
当你使用sendBroadcast或相关的方法时,通常任何其他应用程序可以接收这些广播,你可以通过以下权限的描述来实现谁可以接收到这些广播;
当然,你也可以通过Intent.setPackage来严格地限制其只能与某个单独的应用进行广播的发送;
当使用LocalBraodcastManaget的时候,上述所这些问题都将不会存在;因为intent广播不会跑出当前进程之外去;
(关于LocalBraodcastManaget的使用,可参考LocalBroadcastManager的使用总结)
访问权限可以由广播的接收者或广播的发送者来执行;为了在发送时去执行一个权限,你需要提供一个非空的参数给sendBroadcast(Intent, String)
或者 sendOrderedBroadcast(Intent, String, BroadcastReceiver, android.os.Handler, int, String, Bundle). 为了在接收时执行一个权限,要么可以
通过调用 registerReceiver(BroadcastReceiver, IntentFilter, String, android.os.Handler)或者在你自己的AndroidManifest.xml的 <receiver>里边去
提供一个非空的权限;
代码示例如下:
自定义的广播发送端:
package com.example.administrator.testsendbroadcast; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; public class SendBroadcastActivity extends AppCompatActivity { private final static String TAG = "testBroadcast"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_send_broadcast); <