android broadcast

Broadcast 是广播接收器 可以被动接收其他应用程式/状态等等
主要需要 IntentFilter 过滤/增加intent 跟一个Reciever接收
分为静态注册 跟 动态注册

静态注册 >mainefest.xml +
动态注册 >程序要打开才可以接收广播 并可以自由控制注册跟取消
动态注册

//要先引用注册器 private CustomReciever customReciever=new CustomReciever();//Oncreate//intent注入 IntentFilter filter=new IntentFilter();        filter.addAction(Intent.ACTION_POWER_CONNECTED);        filter.addAction(Intent.ACTION_POWER_DISCONNECTED); //注册      this.registerReceiver(customReciever,filter);  ------------------------- OnDestroy   this.unregisterReceiver(customReciever);    -------------------------------- 注册器 new>Other>broadcastreciever //OnRecieve public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        // an Intent broadcast.        String intentAct=intent.getAction();        if (intentAct !=null){            String toast="test";            switch (intentAct){                case Intent.ACTION_POWER_CONNECTED:                    toast="connected";                    break;                case Intent.ACTION_POWER_DISCONNECTED:                    toast="unconnected";                    break;                case "com.example.Broadcast.ACTION_CUSTOM_BROADCAST":                    toast="custom";                    break;            }            Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();        } 

静态注册+本地广播
本地广播原理:https://blog.csdn.net/u010687392/article/details/49744579

//OnCreate    LocalBroadcastManager.getInstance(this).registerReceiver(         customReciever,newIntentFilter("com.example.Broadcast.ACTION_CUSTOM_BROADCAST")); //OnDestroy      LocalBroadcastManager.getInstance(this).unregisterReceiver(customReciever); //多一个send     public void sendCustomBroadcast(View view) {        Intent custom=new Intent("com.example.Broadcast.ACTION_CUSTOM_BROADCAST");        LocalBroadcastManager.getInstance(this).sendBroadcast(custom);    } //manifest.xml   <receiver            android:name=".CustomReciever"            android:enabled="true"            android:exported="true">            <intent-filter>                <action android:name="com.example.Broadcast.ACTION_CUSTOM_BROADCAST"/>            </intent-filter>        </receiver>

普通广播是异步的。正常广播的接收者通常会同时以不确定的顺序运行。要发送常规广播,请创建广播意图并将其传递给sendBroadcast(Intent)。
本地广播被发送到与发送者在同一应用中的接收者 较为安全。要发送本地广播,请创建广播意图并将其传递给LocalBroadcastManager.sendBroadcast。
有序广播一次传送到一个接收机。当每个接收器执行时,它可以将结果传播到下一个接收器,或者可以取消广播,以使广播不会传递到其他接收器。要发送有序广播,请创建广播意图并将其传递给sendOrderedBroadcast(Intent, String)。

normal broadcast 所有人都会同时收到讯息 不分先后顺序
order broadcast 有先后顺序 故可以阻断
动态注册要打开程序才能接收到广播(可以自由控制注册与取消)
创一个类继承broadcast 并重写class中的onRecieve方法

   private IntentFilter intentFilter;   private NetworkChangeReciever networkChangeReciever; // 继承broadcast    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        intentFilter = new IntentFilter();        intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST"); //网路状态改变        networkChangeReciever = new NetworkChangeReciever();        registerReceiver(networkChangeReciever,intentFilter);        Button button=(Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {               Intent intent=new Intent(                       "com.example.broadcast.MY_BROADCAST"                );             sendBroadcast(intent);            }        });       //      动态注册广播一定要取消注册        protected  void onDestroy(){        super.onDestroy();        unregisterReceiver(networkChangeReciever);    }       class NetworkChangeReciever extends BroadcastReceiver {//        @Override//        //继承方法 网路发生变化//        public void onReceive(Context context, Intent intent){//            ConnectivityManager connectionManager= (ConnectivityManager)//                    getSystemService(Context.CONNECTIVITY_SERVICE);                 // 服务类专门看网路的//            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();//            if (networkInfo != null && networkInfo.isAvailable()) {//                Toast.makeText(context, "network is available",//                        Toast.LENGTH_SHORT).show();//            } else {//                Toast.makeText(context, "network is unavailable",//                        Toast.LENGTH_SHORT).show();//            }

然后记得拿权限 在manifest.xml中加入
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

--
静态注册不用打开程序也能听到广播 在这里我们透过这个原则实现开机广播
创一个实例 BootCompleteReciever
但在manifest里面要多注册这步骤

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><receiver            android:name=".BootCompleteReceiver"            android:enabled="true"            android:exported="true"></receiver>

标籤
intent-filter
<action android:name="android.intent.ation.BOOT_COMPLETED"/>

自定义广播
先新创一个

public class MyBroadcastReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        // an Intent broadcast.        Toast.makeText(context, "recieve in my",                Toast.LENGTH_SHORT).show();        abortBroadcast();        // 截断 后面收不到        throw new UnsupportedOperationException("Not yet implemented");    }}

manifest

<receiver           android:name=".MyBroadcastReceiver"           android:enabled="true"           android:exported="true">           <intent-filter android:priority="100"> //priority是先后顺序               <action android:name="com.example.broadcast.MY_BROADCAST"/>           </intent-filter>       </receiver>

测试有序广播
开第二个专案

public class AnotherBroadcastReciever extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        // an Intent broadcast.        Toast.makeText(context,"recieved in b ",Toast.LENGTH_SHORT).show();        throw new UnsupportedOperationException("Not yet implemented");    }}
        <receiver            android:name=".AnotherBroadcastReciever"            android:enabled="true"            android:exported="true">            <intent-filter>                <action android:name="com.example.broadcast.MY_BROADCAST"/>                //接第一支专案的action            </intent-filter>        </receiver>

mainactivity.java
下面测试本地广播 本地广播安全性比较高 不会被其他城市呼叫
就只是多个本地广播监听器而已

public class MainActivity extends AppCompatActivity {   private IntentFilter intentFilter;   private LocalReceiver localReceiver;   private LocalBroadcastManager localBroadcastManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        localBroadcastManager= LocalBroadcastManager.getInstance(this);        Button button=(Button) findViewById(R.id.button);        button.setOnClickListener(new View.OnClickListener() {            @Override                Intent intent=new Intent("com.example.broadcast.LOCAL_BROADCAST"                );                localBroadcastManager.sendBroadcast(intent);                                      //sendOrderBroadcast(intent); 有先后顺序            }        });        intentFilter = new IntentFilter();        intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST");        localReceiver =new  LocalReceiver();        localBroadcastManager.registerReceiver(localReceiver,intentFilter);    }     class  LocalReceiver extends BroadcastReceiver {        @Override        public void onReceive(Context context, Intent intent){                Toast.makeText(context, "yes",                        Toast.LENGTH_SHORT).show();                  }

重要提示:儘管意图既用于发送广播,也用于通过发起活动startActivity(Intent),但这些动作是完全无关的。广播接收者无法看到或捕获Intent用于启动活动的。同样,播放时Intent,您不能使用它Intent来查找或开始活动。
广播接收器是Android应用程序的基本组件。
广播接收器可以接收系统或应用发送的广播。
将Intent在广播机构使用的是用于启动活动的意图完全不同。
要处理Intent与广播关联的传入消息,请对BroadcastReceiver类进行子类化并实现onReceive()。
您可以在Android清单文件中或以编程方式注册广播接收器。
本地广播是您的应用私有的。要注册和发送本地广播,请使用LocalBroadcastManager。本地广播不涉及进程间通信,这使它们高效。使用本地广播还可以保护您的应用程序免受某些安全问题的影响,因为数据保留在您的应用程序内部。
要Intent为广播创建唯一的动作名称,通常的做法是在动作名称之前添加程序包名称。
如果您的应用定位到API级别26或更高级别,则不能使用清单为大多数隐式广播声明接收方。(隐式广播(包括大多数係统广播)是不针对您的应用的广播。)少数隐式广播是例外。但是,您可以使用动态接收器来接收所有广播。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章