广播分类:
(1).无序广播:sendBroadcast()
(2).有序广播:sendOrderBroadcast()
(3).粘性广播:sendStickyBroadcast()
有序广播:
public class MainActivity extends AppCompatActivity {
Button btn1;
MyReceiver myReceiver;
MyReceiver2 myReceiver2;
MyReceiver3 myReceiver3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = findViewById(R.id.btn);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("www.wxp.com");
intent.putExtra("data","哈哈");
sendOrderedBroadcast(intent,null);
}
});
myReceiver = new MyReceiver();
myReceiver2 = new MyReceiver2();
myReceiver3 = new MyReceiver3();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("www.wxp.com");
//设置优先级
intentFilter.setPriority(500);
registerReceiver(myReceiver,intentFilter);
IntentFilter intentFilter1 = new IntentFilter();
intentFilter1.addAction("www.wxp.com");
intentFilter1.setPriority(1000);
registerReceiver(myReceiver2,intentFilter1);
IntentFilter intentFilter3 = new IntentFilter();
intentFilter3.addAction("www.wxp.com");
intentFilter3.setPriority(0);
registerReceiver(myReceiver3,intentFilter3);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
unregisterReceiver(myReceiver2);
unregisterReceiver(myReceiver3);
}
}
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("www.wxp.com")){
Toast.makeText(context, "一"+intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();
//截断广播,截断广播后其他的不会再接收到广播
abortBroadcast();
}
}
}
public class MyReceiver2 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("www.wxp.com")){
Toast.makeText(context, "二"+intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();
}
}
}
public class MyReceiver3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("www.wxp.com")){
Toast.makeText(context, "三"+intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();
}
}
}
本地广播
EventBus
简化各个组件之间的通信
三要素
1.Event事件可以是任意类型
2.Subscribe事件订阅者
3.Publisher 事件的发布者。我们可以在任意线程里发布事件,一般情况下,使用EventBus.getDefault()就可以得到一个EventBus对象,然后再调用post(Object)方法即可。
四种线程模式
1.POSTING (默认) 表示事件处理函数的线程跟发布事件的线程在同一个线程。
2.MAIN 表示事件处理函数的线程在主线程(UI)线程,因此在这里不能进行耗时操作。
3.BACKGROUND 表示事件处理函数的线程在后台线程,因此不能进行UI操作。如果发布事件的线程是主线程(UI线程),那么事件处理函数将会开启一个后台线程,如果果发布事件的线程是在后台线程,那么事件处理函数就使用该线程。
4.ASYNC 表示无论事件发布的线程是哪一个,事件处理函数始终会新建一个子线程运行,同样不能进行UI操作。
需要导入依赖
implementation ‘org.greenrobot:eventbus:3.1.1’
注意:
------注解: @Subscribe(threadMode = ThreadMode.MAIN) —(在哪个线程中)
public class MainActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.txt);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().post("嘿嘿");
}
});
EventBus.getDefault().register(this);
}
//EventBus需要在方法上加上注解
@Subscribe(threadMode = ThreadMode.MAIN)
public void ee(String s){
textView.setText(s);
}
@Override
protected void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}
}
Otto第三方框架
订阅者的方法必须用public修饰
使用:
1.导入依赖 implementation ‘com.squareup:otto:1.3.8’
2.定义一个类 AppBus, 继承Bus , ---- 单例模式 , 返回Bus 的子类对象
3.在主线程中注册Bus
AppBus.getInstance().register(this);
4.在onDestry() 方法中取消注册
@Override
protected void onDestroy() {
super.onDestroy();
AppBus.getInstance().unregister(this);
}
5.声明订阅者
@Subscribe
public void receiveMessage(String result)
{
Toast.makeText(this, "result = " + result, Toast.LENGTH_SHORT).show();
}
6.发起订阅 – 主线程中
AppBus.getInstance().post(“OTTO 返回的数据”);
系统广播
public class MainActivity extends AppCompatActivity {
MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
registerReceiver(myReceiver,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
switch (intent.getAction()){
case Intent.ACTION_BATTERY_CHANGED:
Toast.makeText(context, "当前电量:"+intent.getIntExtra("level",0), Toast.LENGTH_SHORT).show();
break;
case Intent.ACTION_SCREEN_ON:
Toast.makeText(context, "开屏", Toast.LENGTH_SHORT).show();
break;
case Intent.ACTION_SCREEN_OFF:
Toast.makeText(context, "锁屏", Toast.LENGTH_SHORT).show();
break;
}
}
}
系统广播字段:
系统广播
本地广播和全局广播
全局广播可以跨app接受和发送数据,不安全
本地广播只能本app发送和接受数据,安全
本地广播:
public class MainActivity extends AppCompatActivity {
MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setAction("com.bawei.1704.a");
intent.putExtra("data","你好吗");
// sendBroadcast(intent);
//发送本地广播,只能本app的广播接收者能够接受
LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(intent);
}
});
myReceiver=new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.bawei.1704.a");
//注册本地广播
LocalBroadcastManager.getInstance(this).registerReceiver(myReceiver,intentFilter);
}
}
BroadCastReceiver和Notifcation 的结合使用
public class MyNotificationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("com.bawei.notifi")){
Toast.makeText(context, ""+intent.getStringExtra("data"), Toast.LENGTH_SHORT).show();
}
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
findViewById(R.id.bt).setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void onClick(View v) {
//发送通知
//TODO 1:通知管理者
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//TODO 2:Builder
Notification.Builder builder = new Notification.Builder(Main2Activity.this);
builder.setSmallIcon(R.mipmap.ic_launcher);
//设置View布局
RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.music_notificatuon);
Intent intent = new Intent();
intent.setAction("com.bawei.notifi");
intent.putExtra("data","haha ");
PendingIntent pendingIntent=PendingIntent.getBroadcast(Main2Activity.this,101,intent,PendingIntent.FLAG_ONE_SHOT);
remoteViews.setOnClickPendingIntent(R.id.pause,pendingIntent);
builder.setContent(remoteViews);//
manager.notify(1,builder.build());
}
});
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.bawei.notifi");
registerReceiver(new MyNotificationReceiver(),intentFilter);
}
}