工信部网站备案查询,ui设计师网站,手机中关村在线报价大全,宁波慈溪网站建设1. 广播分类
广播的发送方式#xff1a;标准广播、有序广播、粘性广播广播的类型#xff1a;系统广播、本地广播
1.1 标准广播
完全异步#xff0c;无序的广播发出后#xff0c;所有的广播接收器几乎都会在同一时间收到消息。#xff08;异步#xff09;但是消息无法截…1. 广播分类
广播的发送方式标准广播、有序广播、粘性广播广播的类型系统广播、本地广播
1.1 标准广播
完全异步无序的广播发出后所有的广播接收器几乎都会在同一时间收到消息。异步但是消息无法截断。无序消息可以通过sendBroadcast()方法发送
1.2 有序广播
同步的广播在广播发送出去之后同一时刻只能有一个广播接收器收到消息当这个广播接收器处理完毕后其他广播接收器才能收到消息。过程 通过sendOrderedBroadcast(intent)发送发送出去的同步的广播被Receiver按照优先级先后顺序接收相同优先级的动态注册的广播优先。每次只能有一个接收者收到接收者收到后可以通过setResultData来传递数据给下一个接收者也可以通过abortBroadcast()来终止广播继续向下传递。 设置优先级的方式AndroidManifest.xml
receiverandroid:name.MyReceiverandroid:enabledtrueandroid:exportedtrueintent-filterandroid:priority100/intent-filter
/receiver1.3 粘性广播
类似于粘性事件粘性广播发送后就会一直存在系统的消息容器里面等待对应的处理器去处理。如果暂时没有处理器处理这个消息则一直在消息容器里面处于等待状态粘性广播的Receiver如果被销毁那么下次重建时会自动接收到消息数据。
1.4 系统广播
系统会在发生各种系统事件时自动发送广播。 例如当系统进入和退出飞行模式时系统广播就会发送给所有同意接收相关事件的应用。系统内置的广播比如开启、锁屏、时间等等一般都是有序广播
1.5 本地广播 广播理论上是所有注册这个广播接收器的人都能收到那么会存在恶意注册我们对应的广播接收器来接收到我们的广播。可能造成隐私泄露。 所以我们让广播只能在本应用内传播外部无法接收。只在当前程序内生效的广播 在Manifest.xml中将Receiver的exported属性改为false即可以让该广播接收器只接收本地广播。
2. 广播接收器的注册
创建一个类继承BroadcastReceiver类并重写onReceive方法。这样当有广播来时onReceive就会收到消息被调用。
2.1 静态注册Manifest 在AndroidManifest文件中声明一下这个广播并在receiver字段里面的intent-filter添加需要接收的广播action即可。 从Android8.0开始隐式广播就不允许通过系统注册静态注册的方式来接收了这样是为了防止APP通过此方法唤醒、保活、导致大量APP处于活跃状态进而系统卡顿。
隐式广播隐式广播就是没有指明接收程序的广播广播为什么能唤醒系统软件包管理器会在应用安装时注册receiver。然后接收器会成为应用的一个独立入口这意味着如果应用当前未运行系统可以启动应用并发送广播。只要注册上下文有效上下文注册的接受者就会接收广播。系统广播大多数系统广播都是隐式广播不过少数的系统广播不是所以可以监听。开机启动下面的案例解决方法 尽量使用动态注册代替静态注册如果必须要使用静态注册的话那么就得在创建Intent后调用setComponent设置Component启动指定Receiver接收然后其他注册广播的步骤和原来在Android6.0系统一下注册的方法一样。
manifest xmlns:androidhttp://schemas.android.com/apk/res/androidxmlns:toolshttp://schemas.android.com/toolspackagecom.example.broadcasttest!--监听系统开机广播也需要声明权限可以看到我们使用user-permission标签里又加入了一条android.permission.RECEIVE_BOOT_COMPLETED权限。--uses-permission android:nameandroid.permission.ACCESS_NETWORK_STATE /applicationandroid:allowBackuptrueandroid:iconmipmap/ic_launcherandroid:labelstring/app_nameandroid:roundIconmipmap/ic_launcher_roundandroid:supportsRtltrueandroid:themestyle/Theme.Broadcasttest...receiverandroid:name.MainActivty$BootCompleteReceiverandroid:enabledtrueandroid:exportedtruetools:ignoreInstantiatable!--由于Android系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED的广播因此我们在intent-filter标签里添加了相应的action。--intent-filteraction android:nameandroid.intent.action.BOOT_COMPLETED//intent-filter/receiver/application
/manifest2.2 动态注册
首先创建一个IntentFilter实例使用addAction方法添加对应的action。创建自定义的广播接收器对象Receiver。通过registerReceiver(receiver , intentFilter)传入 接收器对象 和 intentFilter对象实现注册。
动态注册中广播一定要在onDestroy方法中调用unregisterReceiver方法取消注册否则会发生内存泄露。onReceive方法中不能执行耗时操作因为广播接收器中不允许开启线程。
IntentFilter filter new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);
BroadcastReceiver br new MyBroadcastReceiver();
this.registerReceiver(br, filter);//非静态内部类——接收器
public class MyBroadcastReceiver extends BroadcastReceiver {private static final String TAG MyBroadcastReceiver;Overridepublic void onReceive(Context context, Intent intent) {StringBuilder sb new StringBuilder();sb.append(Action: intent.getAction() \n);sb.append(URI: intent.toUri(Intent.URI_INTENT_SCHEME).toString() \n);String log sb.toString();Log.d(TAG, log);Toast.makeText(context, log, Toast.LENGTH_LONG).show();}}只要注册上下文有效上下文注册的BroadcastReceiver就会接收广播如果您在 Activity 上下文中注册只要 Activity 没有被销毁您就会收到广播。如果您在Application上下文中注册只要Application在运行您就会收到广播。
3. 发送广播
3.1 发送标准广播
创建一个Intent对象构造方法中传入需要的action调用setPackage指明发送给的应用通过sendBroadcast发送这个Intent
receiverandroid:name.MyReceiverandroid:enabledtrueandroid:exportedtrueintent-filteraction android:namecom.example.allbroadcasttest.MY_BROADCAST//intent-filter
/receiver 为什么现在一定要设置发送的包名自定义广播默认是隐式广播不能在静态注册下发送所以指定这条广播发给哪个程序变成显示广播。
Override
public void onClick(View v){Intent intent new Intent(com.example.allbroadcasttest.MY_BROADCAST);intent.setComponent(new ComponentName(getPackageName() , com.example.allbroadcasttest.MY_BROADCAST));sendBroadcast(intent);
} 3.2 发送有序广播
也是构造一个对象区别在于发送广播的方式变成了sendOrderBroadcast方法。
需要两个参数一个是Intent另一个是与权限相关的一般是null。然后需要在receiver的AndroidManifest文件中receiver字段下面给广播设置个优先级。如果有Receiver要截断广播就调用abortBoardcast()。
3.3 发送本地广播已被弃用
跟动态注册广播接收器一样只不过在onCreate中创建LocalBroadcastReceiver对象。然后注册和发送都是调用LocalBroadcastManager的registerReceiver和sendBroadcast。
4. 相关问题
4.1 不取消注册广播会导致内存泄露吗 4.2 广播中能执行耗时操作吗 4.3 本地广播为什么被废弃了 4.4 到底什么是广播 4.5 短信用的是什么广播
系统广播会发出一套android.provider.Telephony.SMS_RECEIVED的action
4.6 显示和隐式广播的补充
所以不要用静态注册最好用了必须加 intent.setComponent(new ComponentName(getPackageName() ,com.example.allbroadcasttest.MY_BROADCAST));指定包名和类名