Android开发秘籍学习笔记(八)

来源:互联网 发布:火星时代 知乎 编辑:程序博客网 时间:2024/06/05 16:52

  该目录为学习Android中有关BroadcasrReceiver的学习笔记


BroadcastReceiver的介绍:

  BroadcasrReceive(广播接收器)是Android中的四大组件之一。

①广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。

②应用程序可以拥有任意数量的广播接收器以对所有它感兴趣的通知信息予以响应。所有的接收器均继承自BroadcastReceiver基类。

③广播接收器没有用户界面。然而,它们可以启动一个activity来响应它们收到的信息,或者用NotificationManager来通知用户。通知可以用很多种方式来吸引用户的注意力──闪动背灯、震动、播放声音等等。一般来说是在状态栏上放一个持久的图标,用户可以打开它并获取消息。

Android中的广播事件有两种,一种就是系统广播事件,比如:ACTION_BOOT_COMPLETED(系统启动完成后触发),ACTION_TIME_CHANGED(系统时间改变时触发),ACTION_BATTERY_LOW(电量低时触发)等等。另外一种是我们自定义的广播事件。

BroadcastReceiver的生命周期:

 广播的生命周期并不像Activity那么复杂,广播的生命周期很短,经过调用对象->实现onReceive->结束,整个过程就结束了,从实现复杂度和代码量来看,广播是最简单的Android组件,实现往往只需几行代码。广播对象被构造出来后通常只执行onReceive方法,便结束了其生命周期。
 
 和所有组件一样,广播对象也是在应用进程的主线程中被构造,所以广播对象的执行必须是要同步且快速的。也不推荐在里面开子线程,因为往往线程还未结束,广播对象就已经执行完毕被系统销毁。如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成。每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应


BroadcastReceiver的流程:

  ①注册广播事件:注册方式有两种,一种是静态注册,就是在AndroidManifest.xml文件中定义,注册的广播接收器必须要继承BroadcastReceiver;另一种是动态注册,是在程序中使用Context.registerReceiver注册,注册的广播接收器相当于一个匿名类。两种方式都需要IntentFIlter。
  ②发送广播事件:通过Context.sendBroadcast来发送,由Intent来传递注册时用到的Action
  ③接收广播事件:当发送的广播被接收器监听到后,会调用它的onReceive()方法,并将包含消息的Intent对象传给它。

BroadcastReceiver的使用:

 BroadcReceiver有两种注册方式----静态注册和动态注册。
  静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。静态注册方式的特点:不管改应用程序是否处于活动状态,都会进行监听,比如某个程序时监听内存的使用情况的,当在手机上安装好后,不管改应用程序是处于什么状态,都会执行改监听方法中的内容。
  动态注册方式在activity里面调用函数来注册,和静态的内容差不多。一个形参是receiver,另一个是IntentFilter,其中里面是要接收的action。动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。

静态注册方式的例子:
 
public class MusiBroadcastReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.e("What the fuck", "BOOT_COMPLETED!!!!!");Log.e("What the fuck","" + intent.getAction());MediaPlayer.create(context, R.raw.a).start();}}
静态注册的话一定要在AndroidManifest.xml里面的Application中配置receiver:
<receiver android:name="MusiBroadcastReceiver">            <intent-filter >                <action android:name="android.intent.action.BOOT_COMPLETED"/>            </intent-filter>        </receiver>
这里记住一定要加上一个权限:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
即允许监听是否开机;之前没加这个权限,控制台也没有错误信息搞得我没有修改方向。好了一个静态注册的广播就完成了,将程序安装到模拟器后,重新启动模拟器你就能听到你自己放在R.raw中的音乐了。

动态注册的例子:
布局文件里activity_main.xml里就只用三个Button,这里就不给出了。
import android.app.Activity;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity implements OnClickListener{Button send,register,cancel ;private MyReceiver receiver;protected static final String ACTION = "RECEIVER_ACTION";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);send = (Button) findViewById(R.id.send_btn);register = (Button) findViewById(R.id.register_btn);cancel = (Button) findViewById(R.id.cancel_btn);send.setOnClickListener(this);register.setOnClickListener(this);cancel.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.send_btn:Intent intent = new Intent();intent.setAction(ACTION);sendBroadcast(intent);break;case R.id.register_btn:receiver = new MyReceiver();IntentFilter filter = new IntentFilter();filter.addAction(ACTION);registerReceiver(receiver, filter);break;case R.id.cancel_btn:unregisterReceiver(receiver);  break;default:break;}}}
MainActivity.java中就只需要给三个Button添加监听事件即可。

广播接收器MyReceiver:
import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;import android.widget.Toast;public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Log.i("What the fuck", "MyReceiver onReceiver----->>>");Toast.makeText(context, "MyReceiver onReceiver----->>>", Toast.LENGTH_LONG).show();}}
效果图:

测试:
先点击“发送广播”:logcat里并没有什么信息输出,也没有Toast显示。
点击“注册广播”后,在点击“发送广播”:


点击“注销广播”后在点击“发送广播”:没任何消息输出。因为此时你把BroadcastReceiver注销掉了,在发送就没有注册的广播可以接收了。

  

0 0
原创粉丝点击