第八章:Android广播事件处理 Broadcast Receiver
来源:互联网 发布:stc12c5a16s2数据手册 编辑:程序博客网 时间:2024/06/06 12:27
Broadcast Receiver广播接收器。事件的广播比较简单,同样还是构建Intent对象,然后调用sendBroadcast()方法将广播发出。事件的接收是通过定义一个继承BroadcastReceiver的类来实现的,继承该类后覆盖其onReceive()方法,在该方法中响应事件。
一、自己定义Broadcast Receiver来处理广播事件
首先在你的程序组件里构建你要广播的Intent,使用sendBroadcast()方法发送出去,其次定义一个广播接收器,最后注册该广播接收器。我们可以在代码中注册,也可以在配置文件中注册。
/** * 发出广播 */public class CustomBroadcastActivity extends Activity {//定义一个Action常量private static final String MY_ACTION = "mx.android.ch08.MY_ACTION";private Button btn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btn = (Button) findViewById(R.id.Button01); btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {System.out.println("onClick...");//实例化Intent对象Intent intent = new Intent();//设置Intent action属性intent.setAction(MY_ACTION);//为Intent添加附加信息intent.putExtra("msg", "地瓜地瓜,我是土豆,收到请回复,收到请回复!");//发出广播sendBroadcast(intent);}}); }}
/** * 接收广播 */public class CustomBroadcast_ReceiverActivity extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {System.out.println("onReceive...");//从Intent中获取信息String msg = intent.getStringExtra("msg");//使用Toast显示Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();}}
在AndroidManifest.xml配置文件中声明广播接收器组件
<receiver android:name="CustomBroadcast_ReceiverActivity"> <intent-filter> <action android:name="mx.android.ch08.MY_ACTION" /> </intent-filter></receiver>
二、系统广播事件的使用
标准广播Actino常量
常量名称常量值意义ACTION_BOOT_COMPLETEDandroid.intent.action.BOOT_COMPLETED系统自动完成ACTION_TIME_CHANGEDandroid.intent.action.ACTION_TIME_CHANGED时间改变ACTION_DATE_CHANGEDandroid.intent.action.ACTION_DATE_CHANGED日期改变ACTION_TIMEZONE_CHANGEDandroid.intent.action.ACTION_TIMEZONE_CHANGED时区改变ACTION_BATTERY_LOWandroid.intent.action.ACTION_BATTERY_LOW电量低ACTINO_MEDIA_EJECTandroid.intent.action.ACTINO_MEDIA_EJECT插入或拔出外部媒体ACTION_MEDIA_BUTTONandroid.intent.action.ACTION_MEDIA_BUTTON按下媒体按钮ACTION_PACKAGE_ADDEDandroid.intent.action.ACTION_PACKAGE_ADDED添加包ACTION_PACKAGE_REMOVEDandroid.intent.action.ACTION_PACKAGE_REMOVED删除包
下面实例我们通过接收系统启动完成广播来测试系统广播事件。这样我们不需要自己再定义发出广播的Intent,只需要定义接收器就可以了。
/** * 显示系统启动完成广播接收器 */public class SystemBroadcast extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//显示广播信息Log.i("my_tag","BOOT_COMPLETED~~~~~~~~~");//实例化IntentFilterIntentFilter filter = new IntentFilter();SystemBroadcast r = new SystemBroadcast();//注册Receiver//registerReceiver(r,filter);//注销Receiver//unregisterReceiver(r);}}
在AndroidManifest.xml配置文件中注册该接收器
<receiver android:name="SystemBroadcast"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter></receiver>
也可以通过代码的方式注册接收器。一般是在Activity.onResume()方法中使用Context.registerReceiver()方法来注册一个接收器,在Activity.onPause()方法中使用unregisterReceiver(r)方法来注销一个广播接收器。代码在上面类中注释掉的部分。
三、Notification和NotificationManager的使用
实现可视化的信息显示,通过它们可以显示广播信息的内容、图标以及震动等信息
1、简介
使用Notification和NotificationManager比较简单,一般获得系统级的服务NotificationManager,然后实例化Notification,设置其属性,通过NotificationManager发出通知就可以了。基本步骤说明如下:
1)、获得系统级的服务NotificationManager
2)、实例化Notification对象,并设置其属性
3)、调用setLatestEventInfo()方法在视图中设置图标和时间
4)、发出通知
public class NitificationActivity extends Activity {// 声明Buttonprivate Button sendBtn,calcelBtn;//声明Notificationprivate Notification n;//声明NotificationManagerprivate NotificationManager nm;//Notification坐标IDprivate static final int ID = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//实例化按钮sendBtn = (Button) findViewById(R.id.sendButton01);calcelBtn = (Button) findViewById(R.id.cancelButton02);//获得NotificationManager实例String service = NOTIFICATION_SERVICE;nm = (NotificationManager) getSystemService(service);//实例化Notificationn = new Notification();//设置显示图标,该图标会在状态栏显示int icon = n.icon = R.drawable.ic_launcher;//设置提示信息,该信息也会在状态栏显示String tickerText = "Test Notification";//显示时间long when = System.currentTimeMillis();n.icon = icon;n.tickerText = tickerText;n.when = when;//为按钮添加监听器sendBtn.setOnClickListener(sendListener);calcelBtn.setOnClickListener(calcelListener);}//发送通知监听器private OnClickListener sendListener = new OnClickListener() {@Overridepublic void onClick(View v) {//实例化IntentIntent intent = new Intent(NitificationActivity.this,NitificationActivity.class);//获得PendingIntentPendingIntent pi = PendingIntent.getActivity(NitificationActivity.this, 0, intent, 0);//设置事件信息n.setLatestEventInfo(NitificationActivity.this, "My Title", "My Content", pi);//发出通知nm.notify(ID, n);}};//取消通知监听器private OnClickListener calcelListener = new OnClickListener() {@Overridepublic void onClick(View v) {nm.cancel(ID);}};}
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:text="测试Notification" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <Button android:text="发出通知" android:id="@+id/sendButton01" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:text="取消通知" android:id="@+id/cancelButton02" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
在上面的这个实例中,我们只使用Notification和MotificationManager来显示通知,下面我们写的另外一个实例是Notification、MotificationManager、Broadcast Receiver的一个综合实例。分别定义一个发出广播和接收广播的Activity,当接收到广播后,启动另一个DisplayActivity,在该类中通过Notification和MotificationManager来可视化显示广播通知。
/** * 测试广播和通知 */public class MainActivity extends Activity {private Button btn;//定义Broadcast Receiver actionprivate static final String RECEIVER_ACTION = "mx.android.ch08.RECEIVER_ACTION";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);btn = (Button) findViewById(R.id.zhButton01);btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent();intent.setAction(RECEIVER_ACTION);//发起广播sendBroadcast(intent);}});}}
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/zhButton01" android:text="发出广播" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
/** * 接收广播类 */public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {Intent i = new Intent();//在新的任务中启动Activityi.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//设置Intent启动的组件名称i.setClass(context, DisplayActivity.class);//启动Activity显示通知context.startActivity(i);}}
/** * 显示通知 */public class DisplayActivity extends Activity {//实例化Buttonprivate Button myBtn;//声明Notificationprivate Notification n;//声明NotificationManagerprivate NotificationManager nm;//Notification标识IDprivate static final int ID = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.display);myBtn = (Button) findViewById(R.id.zhCancelButton01);String service = NOTIFICATION_SERVICE;nm = (NotificationManager) getSystemService(service);n = new Notification();//设置显示图标int icon = n.icon = R.drawable.ic_launcher;//设置显示提示信息String tickerText = "Test Notification";//显示时间long when = System.currentTimeMillis();n.icon = icon;n.tickerText = tickerText;n.when = when;Intent intent = new Intent(this, MainActivity.class);PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);//设置事件信息n.setLatestEventInfo(this, "My Title", "My Content", pi);//发出通知nm.notify(ID, n);//取消通知监听器myBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {nm.cancel(ID);}});}}
display.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:text="取消通知" android:id="@+id/zhCancelButton01" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
AndroidManifest.xml
添加:
<activity android:name=".DisplayActivity" /><receiver android:name="MyReceiver"> <intent-filter> <action android:name="mx.android.ch08.RECEIVER_ACTION" /> </intent-filter></receiver>
正如我们上面看到的那样,可以为Notification对象设置图标、显示文字等信息。除了这些Notification,还有很多其他属性可以用来进行提示。例如,设置声音、震动和闪光灯等。设置方式如下:
提示音:
n.defaults |= Notification.DEFAULT_SOUND;n.sound = Uri.parse("file:///sdcard/sound.mp3");n.sound = Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "6");
振动:
n.defaults |= Notification.DEFAULT_VIBRATE;long[] vibrate = {0,50,100,150};n.vibrate = vibrate;
闪光灯:
n.defaults |= Notification.DEFAULT_LIGHTS;n.ledARGB = 0xff00ff00;n.ledOnMS = 300;n.ledOffMS = 1000;n.flags |= Notification.FLAG_SHOW_LIGHTS;
四、AlarmManager的使用
现在的手机普遍都会有一个闹钟的功能,如果使用Android实现一个脑子,可以使用AlarmManager来实现。AlarmManager提供了一种系统级的提示服务,允许你安排在未来的某个时间执行一个服务。AlarmManager对象一般不直接实例化,而是通过Context.getSystemService(Context.ALARM_SERVICE)方法获得。
AlarmManager常用属性和方法
属性或方法名称说明ELAPSED_REALTIME设置闹钟时间,从系统启动开始ELAPSED_REALTIME_WAKEUP设置闹钟时间,从系统启动开始,如果设备休眠则唤醒INTERVAL_DAY设置闹钟时间,每隔一天INTERVAL_FIFTEEN_MINUTES间隔15分钟INTERVAL_HALF_DAY间隔半天INTERVAL_HALF_HOUR间隔半小时INTERVAL_HOUR间隔1小时RTC设置闹钟时间,从系统当前时间开始(System.currentTimeMillis())RTC_WAKEUP设置闹钟时间,从系统当前时间开始,设备休眠则唤醒set(int type,long triggerAtTime,PendingIntent operation)设置在某个时间执行闹钟setRepeating(int type,long triggerAtTime,long interval,PendingIntent operation)设置在某个时间重复执行闹钟setInexactRepating(int type,long triggerAtTime,long interval,PendingIntent operation)设置在某个时间重复执行闹钟,但不是间隔固定时间
AlarmManager的使用步骤如下:
1)、获得AlarmManager实例
2)、闹钟一般是通过发出一个广播来实现的,所以要定义一个PendingIntent发出广播。
3)、调用AlarmManager的方法,设置定时或重复提醒。
下面实例中定义了一个Button,单击Button设置闹钟。定义一个Broadcast Receiver接收广播,并显示信息。
public class MainActivity2 extends Activity {private Button setBtn,calcelBtn;//定义广播ACtionprivate static final String BC_ACTION = "mx.android.ch08.BC_ACTION";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main2);setBtn = (Button) findViewById(R.id.setTimeButton01);calcelBtn = (Button) findViewById(R.id.calcelTimeButton02);//获得AlarmManager实例final AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);Intent intent = new Intent();intent.setAction(BC_ACTION);intent.putExtra("msg","该开会啦~");//实例化PendingIntentfinal PendingIntent pi = PendingIntent.getBroadcast(MainActivity2.this, 0, intent, 0);//获得系统时间final long time = System.currentTimeMillis();//设置按钮单击事件setBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//重复提示,从当前时间开始,间隔5秒am.setRepeating(AlarmManager.RTC_WAKEUP, time, 8*1000, pi);}});calcelBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {am.cancel(pi);}});}}
main2.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/setTimeButton01" android:text="设置闹钟" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/calcelTimeButton02" android:text="取消闹钟" android:layout_width="wrap_content" android:layout_height="wrap_content" /></LinearLayout>
public class MyReceiver2 extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//获得提示信息String msg = intent.getStringExtra("msg");//显示提示信息Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();}}
AndroidManifest.xml
添加:
<receiver android:name="MyReceiver2"> <intent-filter> <action android:name="mx.android.ch08.BC_ACTION" /> </intent-filter></receiver>
- 第八章:Android广播事件处理 Broadcast Receiver
- Android 广播事件处理Broadcast Receiver
- Android的广播事件处理Broadcast Receiver
- 广播事件处理broadcast receiver---系统启动完成提示
- Android广播机制-Broadcast Receiver
- android的广播broadcast和receiver
- android开发广播的使用Broadcast Receiver
- Android之广播接收者 broadcast receiver
- Android学习Broadcast Receiver(广播接收者) 注意事项
- Android中的BroadCast Receiver(广播)详解
- [Android四大组件] Broadcast Receiver 广播
- Android 广播(Broadcast Receiver)使用详解
- 广播接受者(Broadcast Receiver)
- broadcast receiver广播接收器
- 广播接收者Broadcast Receiver
- 广播接收者(Broadcast Receiver)
- Broadcast Receiver广播
- Broadcast Receiver 广播机制
- POJ 2249 Binomial Showdown(我的水题之路——求n个数里取m个数的值)
- linux的chmod与chown命令详解
- Android TextView实现滚动效果
- Jeditable 即时编辑 Jquery 插件用法 (.Net)
- Discuz!7.0数据库表结构
- 第八章:Android广播事件处理 Broadcast Receiver
- 弹出框,原来页面禁止操作
- Intents and Intent Filters
- linux蓝牙驱动代码阅读笔记
- Android 开发Rect
- Escape加密 UnEscape解密 网页加密解密
- javascript数组操作大全
- 如何发布你的Android应用程序
- 依赖倒置、控制反转和依赖注入辨析