Android 接收系统广播(动态和静态)

时间:2023-03-09 16:23:28
Android 接收系统广播(动态和静态)

1、标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到这条广播信息,它们之间没有先后顺序。效率高、无法被截断。

2、有序广播:是一种同步执行的广播,在广播发出后,同一时刻只会有一个广播接收器能够接收到这条广播,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。

  这种广播有先后顺序,优先级高的广播接收器就可以先接收到广播,并且前面的广播接收器可以截断正在传播的广播。

3、动态注册广播:在主代码中直接注册。

4、创建广播接收器:新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法。有广播到来时,onReceive()方法中就会得到执行,具体逻辑就写在这个方法中。

5、在onCreate()方法中使用registerReceiver(BroadcastReceiver receiver, IntentFilter filter) 方法进行动态注册,第一个参数传入创建的类的实例,第二个参数传入IntentFilter的实例。

6、下面的代码实现网络状态的监听:

public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); //action中的值是要监听的系统广播
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver,intentFilter); //用registerReceiver()方法进行注册,分别传入自定义类的实例和意图实例
} //动态注册的广播接收器一定要取消注册,使用unregisterReceiver()方法取消注册
protected void onDestory(){
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
//自定义一个类继承自BroadcastReceiver,并重写他的onReceive()方法
class NetworkChangeReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
Toast.makeText(context,"network changes",Toast.LENGTH_SHORT).show();
       }
  }
}

7、最后要在AndroidManifest.xml中声明权限,否则程序会直接崩溃。注意:中间那行才是申请权限,

   package="example.com.broadcasttest">

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application> </application>

8、模拟器的API要大于等于24才能运行以上代码。仔细、仔细、仔细!!!!千万不要写错单词


9、静态注册广播:在AndroidManifest中注册,不必启动程序就能实现接收广播。

10、以下代码实现接收开机广播:在包名上右键,New—Other—Broadcast Receiver,更改广播接收器的名字,勾选Exported和Enabled。这两个属性分别代表广播接收器接收本程序意外的广播和是否启用这个广播接收器。

package example.com.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast; public class BootCompleteReceiver extends BroadcastReceiver { @Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"Boot Complete",Toast.LENGTH_SHORT).show();
}
}
   <!--应用可以监听该广播,成为自启动权限,但是会拖慢开机速度-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>   。。。。。。。。。。。     <receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<!--由于系统启动后会发出一条值为"android.intent.action.BOOT_COMPLETED"的广播,所以在下面的标签中添加了action-->
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>

10、onReceive()方法中写需要实现的逻辑,但是不要在这方法中写太多逻辑或者进行任何耗时的操作,因为广播接收器中是不允许开启线程的,当方法中运行了较长时间而没有结束,程序就会报错。