一. 广播作为四大组件之一,组件有什么特色呢?第一组件都要在清单进行注册,第二个组件间的通信都是intent在管理第三个需要继承原始类。BroaderRecevier(负责通信).一种通讯方式
二.适用的场景主要有哪些呢?1.是同一app具有多个进程不同组件之间的消息通信;2.是不同app之间的组件的通信3.Andriod系统在特定情况下与app之间消息的通信
不适宜用广播的场景:1.同一app的同一组件可以使用handler2.同一app内部不同组件之间可以使用接口回调(观察者模式,eventbus)
三.广播的使用:有发送方和接收方,如何接受到别人发的广播呢?主要靠action,通过过滤器intentfilter就可以筛选,这个action这个就是系统的所有的自带的动作,比如开关机,获取sd卡,或者短信什么什么的,intentfilter相当于是一个频道过滤器它的里面放了一个你要的action,有这个action那么就会收到广播,就能够收到带过来的消息,消息是放在intent里面的,广播活了之后就可以调用那个里面的方法public void onReceive(Context context, Intent intent)
四.首先介绍一下接广播,有两种注册,1.写个class继承广播2.实现方法3.清单注册。
1.写一个类MyReciver继承了BroadcastReceiver 里面只有一个方法需要实现,当你收到广播,就会调这个方法,你要的数据就在intent里面,你只要从intent拿到就可以了
public class MyReciver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent intent1=new Intent(context,PlayerActivity.class); intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent1); } }
2.有两种注册方式:一个是静态,一个是动态,首先介绍下静态。静态注册比较消耗资源(开机启动),静态注册程序关闭后依然能接收到消息。现在来做一个开机启动,不如开机以后我就给发送一条广播,然后就让该app完成页面跳转
Intent intent1=new Intent(context,PlayerActivity.class);//在你进行跳转的时候由于该页面PlayerActivity还没有在栈里面,所以没法跳转,那么就要给创一个栈 intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//然后就可以跳转 context.startActivity(intent1);3.然后进行注册
//你的recicer的名字
上面这同时种清单注册就属于静态注册,同时我们在静态注册中我们只是进行广播没有发消息,下面我们进行动态注册,发消息。<receiver android:name=".MyReciver">//这个就是筛选想要的广播,比如开机广播,短信广播,电池耗电量广播 <intent-filter >
//action只能设置一个 <action android:name="android.intent.action.BOOT_COMPLETED"></action>//这个是对action的限制条件 <category android:name="android.intent.category.DEFAULT"/> </intent-filter>//这个是因为有些广播会被关闭,这个时候我们可以利用一个手机卡的确保发了广播。 <intent-filter> <action android:name="android.intent.action.PACKAGE_ADDED"/> <action android:name="android.intent.action.PACKAGE_REMOVED"/> <action android:name="android.intent.action.PACKAGE_REPLACED"/> <data android:scheme="package"/> </intent-filter> </receiver>3.360管家可能会关闭某些广播,这个时候可以监听sd卡,同时还需要加上权限。<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>如果是特殊权限还需要用户动态授权
动态注册:会注册的进程共存亡,(activty和服务会注册),尝试在activty里面注册广播,修改button的文本
1.首先new一个receiver,
BroadcastReceiver receiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int level=intent.getIntExtra("level",-2); int scale=intent.getIntExtra("scale",-2); but.setText("level"+level +"scale"+scale); } };
2.注册时还需要一个filter,设置一个actionIntentFilter filter=new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED);3.注册reciver4.接收到广播后然后取出来this.registerReceiver(receiver,filter);
int level=intent.getIntExtra("level",-2); int scale=intent.getIntExtra("scale",-2); but.setText("level"+level +"scale"+scale);下面时activity里的所有代码
public class NotifictionActivity extends AppCompatActivity { Button but; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_notifiction); BroadcastReceiver receiver=new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { int level=intent.getIntExtra("level",-2); int scale=intent.getIntExtra("scale",-2); but.setText("level"+level +"scale"+scale); } }; IntentFilter filter=new IntentFilter(); filter.addAction(Intent.ACTION_BATTERY_CHANGED); this.registerReceiver(receiver,filter);