推广网站加盟,wordpress付费主题破解版,wordpress用户注册怎么设置,公司网站建设及维护管理总结Android Studio学习笔记——广播机制 5.1 广播机制简介5.2 接收系统广播5.2.1 动态注册监听网络变化5.2.2 静态注册实现开机启动 5.3 发送自定义广播5.3.1 发送标准广播5.3.2 发送有序广播 5.4 使用本地广播5.5 广播的最佳实践——强制下线功能 5.1 广播机制简介 
安卓每个应用… Android Studio学习笔记——广播机制 5.1 广播机制简介5.2 接收系统广播5.2.1 动态注册监听网络变化5.2.2 静态注册实现开机启动 5.3 发送自定义广播5.3.1 发送标准广播5.3.2 发送有序广播 5.4 使用本地广播5.5 广播的最佳实践——强制下线功能 5.1 广播机制简介 
安卓每个应用程序都可以对自己感兴趣的广播进行注册要该程序就只会接收到自己所关心的广播内容。这些广播可能是来自于系统的也可能是来自于其他应用。安卓提供了一套完整的API允许应用程序自由的发送和接收广播。安卓中的广播主要可以分为两种类型标准广播和有序广播。 标准广播Normal broadcasts是一种完全异步执行的广播在广播发出之后所有的广播接收器几乎都会在同一时刻接收到这条广播信息。他们之间没有任何先后顺序。这种广播效率会比较高。但同时也意味着他是无法被截断的。 有序广播 ordered Broadcasst是一种同步执行广播。在广播发出之后同意时刻只会有一个广播接收器能够接收到这条广播。当这个广播接收器中的逻辑执行完毕后广播才会继续传递所以此时广播接收器是有先后顺序的。优先级高的广播接收器就可以先接收到广播信息。并且前面的广播接收器还可以截断正在传递的广播。这样后面的广播接收器就无法收到广播信息。 
5.2 接收系统广播 
注册广播的方式有两种。在代码中注册称为动态注册在AndroidManifest.xml中注册成为静态注册。 
5.2.1 动态注册监听网络变化 
在代码中注册广播动态注册动态注册的广播接收器一定都要取消注册才行通过onDestroy方法中调用unregister方法来实现。 
public class MainActivity extends AppCompatActivity {private IntentFilter intentFilter;private NetworkChangeReceiver networkChangeReceiver;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - {Insets systemBars  insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});intentFilter  new IntentFilter();intentFilter.addAction(android.net.com.CONNECTIVITY_CHANGE);networkChangeReceiver  new NetworkChangeReceiver();registerReceiver(networkChangeReceiver,intentFilter);}Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(networkChangeReceiver);}
}public class NetworkChangeReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,network changes,Toast.LENGTH_SHORT).show();}
} 
5.2.2 静态注册实现开机启动 
动态注册的广播可以自由的控制注册与注销在灵活性方面有很大的优势但是它也存在着一个缺点即必须在程序启动之后才能接收到广播因为注册的逻辑是写在OnCreate方法中的。 如果想要在程序未启动的时候就能接受到广播需要使用静态注册的方法。 创建new-Other-BroadcastReceiver弹出创建Broadcast的窗口。创建一个BootCompleteReceiver的广播接收器。 
public class BootCompleteReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {// TODO: This method is called when the BroadcastReceiver is receiving// an Intent broadcast.Toast.makeText(context,Boot Complete,Toast.LENGTH_LONG).show();throw new UnsupportedOperationException(Not yet implemented);}
}静态广播注册接收器一定要在AndroidManifest.xml文件中注册才能使用。上一步创建广播接收器在在AndroidManifest.xml中的注册会自动完成。 
receiverandroid:name.BootCompleteReceiverandroid:enabledtrueandroid:exportedtrue/receiver在//applicaton标签内多了一个新的标签《receiver》所有的静态广播注册都是在这里注册的。通过android:name来具体指定注册哪一个广播接收器。 目前BootCompleteReceiver还是不能接收到开机广播还需要对AndroidManifest.xml文件进行修改才行。  因为Android系统启动后会发出一条android.intent.action.BOOT_COMPLETED的广播所以在接收器的《intent-filter》中添加相应action。 注意 不要在OnReceive方法中添加过多的逻辑或其他耗时的操作因为在广播接收器中是不允许开启线程的当OnReceive方法运行了较长时间而没有结束程序就会报错。因此广播接收器更多的是扮演一种打开程序其他组件的角色比如创建一条状态栏通知或者启动一个服务等。 
5.3 发送自定义广播 
5.3.1 发送标准广播 
public class MainActivity extends AppCompatActivity {...Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - {Insets systemBars  insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});Button button(Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {Intent intent new Intent(com.example.broadcast.MY_BROADCAST);sendBroadcast(intent);}});}}广播是一种跨进程通信的方式。 验证该方式可以新建一个BroadcastTest2项目点击File-》new-》New Project进行创建。 将项目创建好之后还需要在这个项目下定义一个广播接收器用于接收上面的自定义广播。  在BroadcastTest2项目中AnotherBroadcastReceiver同样是接收com.example.broadcasttest.MY_BROADCAST这条广播和BroadcastTest项目中的MyBroadcastReceiver是一样的。 现在运行BroadcastTest2按home键再去BroadcastTest界面点击button按钮发送广播会分别弹出两次提示消息说明BroadcastTest发送的广播不仅自己接收到BroadcastTest2也接收到了。 
5.3.2 发送有序广播 
5.3.1都是标准广播如果要发送有序广播重新回到BroadcastTest项目修改MainActivity中的代码 
public class MainActivity extends AppCompatActivity {...Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - {Insets systemBars  insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});Button button(Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {Intent intent new Intent(com.example.broadcast.MY_BROADCAST);sendOrderedBroadcast(intent,null);}});}}发送有序广播只需要改动一行代码这时候广播接受器是有先有顺序的而且前面的广播接收器还可以将广播截断以阻止其继续传播。 在注册广播的时候定义广播接收器的先后顺序修改AndroidManifest.xml中的代码 receiverandroid:name.AnotherBroadcastReceiverandroid:enabledtrueandroid:exportedtrueintent-filter android:priority100action android:namecom.example.broadcasttest.MY_BROADCAST //intent-filter/receiver将MyBroadcastReceiver的优先级设成了100以保证它一定会在AnotherBroadcastReceiver之前收到广播。 MyBroadcastReceiver有优先权就可以选择是否允许广播继续传递。 
public class MyBroadcastReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {// TODO: This method is called when the BroadcastReceiver is receiving// an Intent broadcast.abortBroadcast();//throw new UnsupportedOperationException(Not yet implemented);}
}abortBroadcast()可以截断广播终止广播的传递。 
5.4 使用本地广播 
前面发送和接收的广播全部属于全局广播即发出的广播可以被其他任何其他应用程序收到可以接受到来自于其他应用程序的广播。这样很容易引起安全性的问题。如发送一些关键性数据的广播可能被其他应用去截获或者其他应用程序不停的向我们的广播接收器发各种垃圾广播。 为了解决广播的安全性问题安卓引入了一套本地广播机制。使用这个广播只能够在应用程序的内部进行传播。并且广播接收器也只能接受来自本应用程序发出的广播。 本地广播的用法并不复杂主要就是用了一个LocalBroadcastManager来对广播进行管理。并提供了发送广播和注册广播接收器的方法。 
public class MainActivity extends AppCompatActivity {private IntentFilter intentFilter;//private NetworkChangeReceiver networkChangeReceiver;private LocalReceiver localReceiver;private LocalBroadcastManager localBroadcastManager;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) - {Insets systemBars  insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});//intentFilter  new IntentFilter();//intentFilter.addAction(android.net.com.CONNECTIVITY_CHANGE);//networkChangeReceiver  new NetworkChangeReceiver();//registerReceiver(networkChangeReceiver,intentFilter);localBroadcastManagerLocalBroadcastManager.getInstance(this);Button button(Button) findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View v) {//Intent intent new Intent(com.example.broadcast.MY_BROADCAST);//sendBroadcast(intent);//sendOrderedBroadcast(intent,null);Intent intent new Intent(com.example.broadcast.LOCAL_BROADCAST);localBroadcastManager.sendBroadcast(intent);}});intentFilter  new IntentFilter();intentFilter.addAction(android.net.com.LOCAL_CHANGE);localReceiver new LocalReceiver();localBroadcastManager.registerReceiver(localReceiver,intentFilter);//注册本地广播监听器}Overrideprotected void onDestroy() {super.onDestroy();unregisterReceiver(networkChangeReceiver);}
}public class LocalReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {Toast.makeText(context,received local broadcast,Toast.LENGTH_SHORT).show();}
} 
本地广播是无法通过静态注册的方式来接收的。 
5.5 广播的最佳实践——强制下线功能 
后续更新git链接