day12-13BroadcastReceiver广播、EventBus

广播分类:

(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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值