看完这800字,你将获得如下技能:
你的壁纸被女票更换了,你的程序会记录下来,并警示她。
一、我讲
今天,我主要简单一讲 Android
中广播 BroadcastReceiver
这个知识点。
1.1 广播 BroadcastReceiver
广播站时刻在发送信号,有设备接收到这个频率,就可以收听这个节目。
对于广播,你听或者不听,它都在那里。你愿意听,就听,不听,也不耽误它对外发送。
Android系统中也有广播 BroadcastReceiver
这个概念,而且和你理解的广播极其一致。
Android内置了多个系统广播,只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会对外发出相应的广播。你愿意接收,就接收,不接收它也往外发。
我愿意做一个Android设备的收音机,但是我怎么才能收到它的信号呢?
要收听系统的广播,需要两步:第一,构建广播类(收到之后做什么);第二,注册广播(要收听什么类型的广播)。
1.2 定义自己的广播接收器
我们可以写一个类来收听广播,只要继承系统的BroadcastReceiver这个类:
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())){ //你解锁屏幕了 } } } 复制代码
1.3 向系统注册广播
注册广播需要这样:
IntentFilter intentFilter = new IntentFilter();//构建过滤器 //给过滤器添加想要收听的动作,相当于收音机调频 intentFilter.addAction(Intent.ACTION_USER_PRESENT); registerReceiver(new MyReceiver(),intentFilter);//注册广播 复制代码
二、你做
再来回顾一下,我们要做的这个小应用,当系统壁纸被更换了之后,会弹出提示语: 你更换了壁纸,被我看到了 。这个提示是我们的应用弹出的。
这是本系列第一个只有 Java
代码,没有 xml
布局的例子了。
一个 MainActivity
全部实现,代码如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 构建过滤器 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_WALLPAPER_CHANGED); // 注册广播 registerReceiver(new MyReceiver(),intentFilter); } // 我的广播 public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (Intent.ACTION_WALLPAPER_CHANGED.equals(intent.getAction())){ Toast.makeText(context, "你更换了壁纸,被我看到了", Toast.LENGTH_LONG).show(); } } } } 复制代码
首先建立一个自己的广播接收器 MyReceiver
,注意要继承 BroadcastReceiver
。
然后,在类里面有一个 onReceive
方法,这里面会传来 Android 系统发来的你关注的所有广播。
出于严谨(如果只注册了更换壁纸,那么这里面只能收到唯一一个),在 onReceive
里我们还是加一个 if
判断,如果是壁纸更换,我们弹出提示。
最后,在 Activity 的 onCreate
方法里,定义一个过滤器 IntentFilter ,然后把我们的 MyReceiver
和过滤器绑定,告诉系统如果有涉及到 intentFilter
里面描述的消息,请通知到 MyReceiver
。
好了,运行一下,更换个壁纸试试,效果很哇塞!
如果我们不想收听广播了,怎么办呢?就像很多App可以选择不推送给我消息。
Android提供了一个解除广播的方法叫 unregisterReceiver(myReceiver)
。调用它解除即可。