android广播事件处理broadcast receive

一.Broadcast Receive为广播接收器,它和事件处理机制类似,只不过事件的处理机制是程序组件级别的,而广播处理机制是系统级别的。

Broadcast Receiver用于接收并处理广播通知(broadcast announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的 broadcast receivers来响应它觉得重要的通知。broadcast receiver可以通过多种方式通知用户:启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。

通常我们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个Intent出去,我们可以利用注册一个Broadcast Receiver来监听到这些Intent并获取Intent中的数据。

 

 

二.事件的广播比价简单,构建Intent对象,调用sendBroadcast()方法将广播发出。事件的接收是通过定义一个继承BroadcastReceiver类来实现,继承该类后覆盖其onReceiver方法,并在该方法中相应事件。
MainActivity:
Intent intent=new Intent();
intent.setAction(MY_ACTION);
intent.putExtra("msg","请回复");
sendBroadcast(intent);
MyReceiver:
public calss MyReceiver extends BroadcastReceiver{
public void onReceiver(Context ctx,intent intent){
//从Intent中获得信息
String msg=intent.getString("msg");
Toast.makeText(ctx,msg,Toast.LENGTH_LONG).show()


}


}

三.系统广播事件的使用
1. 这些广播是系统自动发出,我们直接定义事件接收器进行接收。
通过配置文件注册
MyReceiver2:
public class MyReceiver2 extends BroadcastReceiver{

public void onReceiver( Context context,Intent intent){
Log.i("my_tag","BOOT_COMPLETED")

}


}
AndroidMainifest.xml:
<receiver android:name="MyReceiver2">
<intent-filter>
<android android:name="android.intent.android.BOOT_COMPLETED">
</intent-filter>
</receiver>
通过代码注册:
IntentFilter filter=new IntentFilter();//实例化
//实例化Receiver
MyReceiver2=new MyReceiver2();
//注册Receiver
registerReceiver(r,filter);
//注销Receiver
unregisterReceiver(r);
四.Notification和NotificationManager的使用
Broadcast Receiver组件并没有提供可视化的界面来显示广播信息。这里我们可以使用Notification和Notification Manager来实现可视化的信息的界面,通过使用它们 ,我们可以显示广播信息的内容,图标及震动信息。
五.AlarmManager的使用
现在的手机普遍都会有一个闹钟功能,如果使用Android来实现一个闹钟,可以使用AlarmManager来实现。AndroidManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个任务,AlarmManager对象一般不直接实例化,而是通过Context.getSystemService(Context.ALARM_SERVICE)方法获得。

 

实例一、自定义broadcast receive来处理广播事件

/Chapter08_Broadcast_Receiver1/src/com/amaker/ch08/app/MainActivity.java

 

  
  
  
  
  1. 代码  
  2.  
  3. package com.amaker.ch08.app;  
  4.  
  5. import com.amaker.ch08.app.R;  
  6.  
  7. import android.app.Activity;  
  8. import android.content.Intent;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. /**  
  14.  *   
  15.  * 发出广播  
  16.  */  
  17. public class MainActivity extends Activity {  
  18.     // 定义一个Action常量  
  19.     private static final String MY_ACTION = "com.amaker.ch08.action.MY_ACTION";  
  20.     // 定义一个Button对象  
  21.     private Button btn;  
  22.     @Override  
  23.     public void onCreate(Bundle savedInstanceState) {  
  24.         super.onCreate(savedInstanceState);  
  25.         // 设置当前布局视图  
  26.         setContentView(R.layout.main);  
  27.         btn = (Button)findViewById(R.id.Button01);  
  28.         // 为按钮设置单击监听器  
  29.         btn.setOnClickListener(new OnClickListener() {  
  30.             @Override  
  31.             public void onClick(View v) {  
  32.                 // 实例化Intent对象  
  33.                 Intent intent = new Intent();  
  34.                 // 设置Intent action属性  
  35.                 intent.setAction(MY_ACTION);  
  36.                 // 为Intent添加附加信息  
  37.                 intent.putExtra("msg", "地瓜地瓜,我是土豆,收到请回复,收到请回复!");  
  38.                 // 发出广播  
  39.                 sendBroadcast(intent);  
  40.             }  
  41.         });  
  42.     }  

自定义广播事件的使用

/Chapter08_Broadcast_Receiver1/src/com/amaker/ch08/app/MyReceiver.java

 

  
  
  
  
  1. 代码  
  2.  
  3. package com.amaker.ch08.app;  
  4.  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.widget.Toast;  
  9.  
  10. /**  
  11.  * 接收广播  
  12.  */  
  13. public class MyReceiver extends BroadcastReceiver{  
  14.       
  15.     @Override  
  16.     public void onReceive(Context cxt, Intent intent) {  
  17.         // 从Intent中获得信息  
  18.         String msg = intent.getStringExtra("msg");  
  19.         // 使用Toast显示  
  20.         Toast.makeText(cxt, msg, Toast.LENGTH_LONG).show();  
  21.     }  

/Chapter08_Broadcast_Receiver1/src/com/amaker/ch08/app/MyReceiver2.java

 

  
  
  
  
  1. 代码  
  2.  
  3. package com.amaker.ch08.app;  
  4.  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.util.Log;  
  9.  
  10. /**  
  11.  *   
  12.  * 显示系统启动完成广播接收器  
  13.  */  
  14. public class MyReceiver2 extends BroadcastReceiver{  
  15.  
  16.     @Override  
  17.     public void onReceive(Context context, Intent intent) {  
  18.         // 显示广播信息  
  19.         Log.i("my_tag", "BOOT_COMPLETED~~~~~~~~~~~~~~~~");  
  20.     }  
  21.  

系统广播事件的使用

/Chapter08_Broadcast_Receiver1/res/layout/main.xml

 

  
  
  
  
  1. 代码  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  5.     android:orientation="vertical" 
  6.     android:layout_width="fill_parent" 
  7.     android:layout_height="fill_parent" 
  8.     > 
  9.  
  10.     <Button   
  11.         android:text="发出广播..."   
  12.         android:id="@+id/Button01"   
  13.         android:layout_width="wrap_content"   
  14.         android:layout_height="wrap_content"/> 
  15.           
  16. </LinearLayout> 

/Chapter08_Broadcast_Receiver1/AndroidManifest.xml

 

  
  
  
  
  1. 代码  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  5.       package="com.amaker.ch08.app" 
  6.       android:versionCode="1" 
  7.       android:versionName="1.0"> 
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  9.         <activity android:name=".MainActivity" 
  10.                   android:label="@string/app_name"> 
  11.             <intent-filter> 
  12.                 <action android:name="android.intent.action.MAIN" /> 
  13.                 <category android:name="android.intent.category.LAUNCHER" /> 
  14.             </intent-filter> 
  15.         </activity> 
  16.           
  17.         <receiver android:name="MyReceiver"> 
  18.             <intent-filter> 
  19.                 <action  android:name="com.amaker.ch08.action.MY_ACTION"/> 
  20.             </intent-filter> 
  21.         </receiver> 
  22.           
  23.         <receiver android:name="MyReceiver2"> 
  24.             <intent-filter> 
  25.                 <action  android:name="android.intent.action.BOOT_COMPLETED"/> 
  26.             </intent-filter> 
  27.         </receiver> 
  28.           
  29.     </application> 
  30.     <uses-sdk android:minSdkVersion="3" /> 
  31. </manifest> 

二、notification和notificationmanager的使用

1、获取系统级的服务notificationmanager

String service = NOTIFICATION_SERVICE;
NotificationManager nm = (NotificationManager)getSystemService(service);

2、实例化Notification
Notification n = new Notification();
// 设置显示图标,该图标会在状态栏显示
int icon = n.icon = R.drawable.icon;
// 设置显示提示信息,该信息也会在状态栏显示
String tickerText = "Test Notification";
// 显示时间
long when = System.currentTimeMillis();
n.icon = icon;
n.tickerText = tickerText;
n.when = when;

// 也可以通过这种构造方法来设置
Notification n1 = new Notification(icon, tickerText, when);

3、实例化Intent
Intent intent = new Intent(this, MainActivity_Temp.class);
// 获得PendingIntent
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
// 设置事件信息
n.setLatestEventInfo(this, "My Title", "My Content", pi);
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;
 

4、发通知
// 标示该通知的ID
int ID = 1;
// 发出通知
nm.notify(ID, n);

 

利用notification和notificationmanager来实现可视化的消息显示。

/Chapter08_Notification1/src/com/amaker/ch08/app/MainActivity.java

 

  
  
  
  
  1. 代码  
  2.  
  3. package com.amaker.ch08.app;  
  4.  
  5. import com.amaker.ch08.app.R;  
  6.  
  7. import android.app.Activity;  
  8. import android.app.Notification;  
  9. import android.app.NotificationManager;  
  10. import android.app.PendingIntent;  
  11. import android.content.Intent;  
  12. import android.os.Bundle;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16.  
  17. /**  
  18.  * 测试通知  
  19.  */  
  20.  
  21. public class MainActivity extends Activity {  
  22.     // 声明按钮  
  23.     private Button sendBtn,cancelBtn;  
  24.     // 声明Notification  
  25.     private Notification n ;  
  26.     // 声明NotificationManager  
  27.     private NotificationManager nm;  
  28.     // Notification标示ID  
  29.     private static final int ID = 1;  
  30.     @Override  
  31.     public void onCreate(Bundle savedInstanceState) {  
  32.         super.onCreate(savedInstanceState);  
  33.         setContentView(R.layout.main);  
  34.         // 实例化按钮  
  35.         sendBtn = (Button)findViewById(R.id.sendButton01);  
  36.         cancelBtn = (Button)findViewById(R.id.cancelButton02);  
  37.           
  38.         // 获得NotificationManager实例  
  39.         String service = NOTIFICATION_SERVICE;  
  40.         nm = (NotificationManager)getSystemService(service);  
  41.           
  42.         // 实例化Notification  
  43.         n = new Notification();  
  44.         // 设置显示图标,该图标会在状态栏显示  
  45.         int icon = n.icon = R.drawable.happy;   
  46.         // 设置显示提示信息,该信息也会在状态栏显示  
  47.         String tickerText = "Test Notification";   
  48.         // 显示时间  
  49.         long when = System.currentTimeMillis();  
  50.         n.icon = icon;  
  51.         n.tickerText = tickerText;  
  52.         n.when = when;  
  53.         // 为按钮添加监听器  
  54.         sendBtn.setOnClickListener(sendListener);  
  55.         cancelBtn.setOnClickListener(cancelListener);  
  56.           
  57.     }  
  58.     // 发送通知监听器  
  59.     private OnClickListener sendListener = new OnClickListener() {  
  60.         @Override  
  61.         public void onClick(View v) {  
  62.             // 实例化Intent  
  63.             Intent intent = new Intent(MainActivity.this, MainActivity.class);   
  64.             // 获得PendingIntent  
  65.             PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);   
  66.             // 设置事件信息  
  67.             n.setLatestEventInfo(MainActivity.this, "My Title", "My Content", pi);   
  68.             // 发出通知  
  69.             nm.notify(ID, n);  
  70.         }  
  71.     };  
  72.     // 取消通知监听器  
  73.      private OnClickListener cancelListener = new OnClickListener() {  
  74.         @Override  
  75.         public void onClick(View v) {  
  76.             // 取消通知  
  77.             nm.cancel(ID);  
  78.         }  
  79.     };  

/Chapter08_Notification1/res/layout/main.xml

 

  
  
  
  
  1. 代码  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  5.     android:orientation="vertical" 
  6.     android:layout_width="fill_parent" 
  7.     android:layout_height="fill_parent" 
  8.     > 
  9. <TextView    
  10.     android:layout_width="fill_parent"   
  11.     android:layout_height="wrap_content"   
  12.     android:text="测试Notification" 
  13.     /> 
  14.       
  15. <Button   
  16.     android:text="发出通知"   
  17.     android:id="@+id/sendButton01"   
  18.     android:layout_width="wrap_content"   
  19.     android:layout_height="wrap_content"></Button> 
  20.  
  21. <Button   
  22.     android:text="取消通知"   
  23.     android:id="@+id/cancelButton02"   
  24.     android:layout_width="wrap_content"   
  25.     android:layout_height="wrap_content"></Button> 
  26.  
  27. </LinearLayout> 

/Chapter08_Notification1/AndroidManifest.xml

 

  
  
  
  
  1. 代码  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  5.       package="com.amaker.ch08.app" 
  6.       android:versionCode="1" 
  7.       android:versionName="1.0"> 
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  9.         <activity android:name=".MainActivity" 
  10.                   android:label="@string/app_name"> 
  11.             <intent-filter> 
  12.                 <action android:name="android.intent.action.MAIN" /> 
  13.                 <category android:name="android.intent.category.LAUNCHER" /> 
  14.             </intent-filter> 
  15.         </activity> 
  16.  
  17.     </application> 
  18.     <uses-sdk android:minSdkVersion="3" /> 
  19.  
  20. </manifest> 

二、notification、notificationmanager和broadcast receiver的综合实例

/Chapter08_Notification2/src/com/amaker/ch08/app/MainActivity.java

 

  
  
  
  
  1. 代码  
  2.  
  3. package com.amaker.ch08.app;  
  4.  
  5. import com.amaker.ch08.app.R;  
  6.  
  7. import android.app.Activity;  
  8. import android.content.Intent;  
  9. import android.os.Bundle;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. /**  
  14.  * 测试广播和通知  
  15.  */  
  16. public class MainActivity extends Activity {  
  17.     // 声明Button  
  18.     private Button btn;  
  19.     // 定义Broadcast Receiver action  
  20.     private static final String MY_ACTION = "com.amaker.ch08.app.MY_ACTION";  
  21.     @Override  
  22.     public void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         // 设置当前布局视图  
  25.         setContentView(R.layout.main);  
  26.         // 实例化Button  
  27.         btn = (Button)findViewById(R.id.Button01);  
  28.         // 添加事件监听器  
  29.         btn.setOnClickListener(listener);  
  30.     }  
  31.     // 创建事件监听器  
  32.     private OnClickListener listener = new OnClickListener() {  
  33.         @Override  
  34.         public void onClick(View v) {  
  35.             // 实例化Intent  
  36.             Intent intent = new Intent();  
  37.             // 设置Intent action属性  
  38.             intent.setAction(MY_ACTION);  
  39.             // 发起广播  
  40.             sendBroadcast(intent);  
  41.         }  
  42.     };  

/Chapter08_Notification2/src/com/amaker/ch08/app/DisplayActivity.java

 

  
  
  
  
  1. 代码  
  2.  
  3. package com.amaker.ch08.app;  
  4.  
  5. import com.amaker.ch08.app.R;  
  6.  
  7. import android.app.Activity;  
  8. import android.app.Notification;  
  9. import android.app.NotificationManager;  
  10. import android.app.PendingIntent;  
  11. import android.content.Intent;  
  12. import android.os.Bundle;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16.  
  17. public class DisplayActivity extends Activity {  
  18.     // 声明按钮  
  19.     private Button cancelBtn;  
  20.     // 声明Notification  
  21.     private Notification n ;  
  22.     // 声明NotificationManager  
  23.     private NotificationManager nm;  
  24.     // Notification标示ID  
  25.     private static final int ID = 1;  
  26.     @Override 
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.main2);  
  30.         // 实例化按钮  
  31.         cancelBtn = (Button)findViewById(R.id.cancelButton02);  
  32.         // 获得NotificationManager实例  
  33.         String service = NOTIFICATION_SERVICE;  
  34.         nm = (NotificationManager)getSystemService(service);  
  35.           
  36.         // 实例化Notification  
  37.         n = new Notification();  
  38.         // 设置显示图标,该图标会在状态栏显示  
  39.         int icon = n.icon = R.drawable.happy;   
  40.         // 设置显示提示信息,该信息也会在状态栏显示  
  41.         String tickerText = "Test Notification";   
  42.         // 显示时间  
  43.         long when = System.currentTimeMillis();  
  44.         n.icon = icon;  
  45.         n.tickerText = tickerText;  
  46.         n.when = when;  
  47.           
  48.         // 实例化Intent  
  49.         Intent intent = new Intent(this, MainActivity.class);   
  50.         // 获得PendingIntent  
  51.         PendingIntent pi = PendingIntent.getActivity(this0, intent, 0);   
  52.         // 设置事件信息  
  53.         n.setLatestEventInfo(this"My Title""My Content", pi);   
  54.         // 发出通知  
  55.         nm.notify(ID, n);  
  56.           
  57.         // 为按钮添加监听器  
  58.         cancelBtn.setOnClickListener(cancelListener);  
  59.     }  
  60.       
  61.     // 取消通知监听器  
  62.      private OnClickListener cancelListener = new OnClickListener() {  
  63.         @Override 
  64.         public void onClick(View v) {  
  65.             // 取消通知  
  66.             nm.cancel(ID);  
  67.         }  
  68.     };  

/Chapter08_Notification2/src/com/amaker/ch08/app/MyReceiver.java

 

  
  
  
  
  1. 代码  
  2.  
  3. package com.amaker.ch08.app;  
  4.  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8.  
  9. public class MyReceiver extends BroadcastReceiver{  
  10.     @Override 
  11.     public void onReceive(Context context, Intent intent) {  
  12.         // 实例化Intent  
  13.         Intent i = new Intent();  
  14.         // 在新的任务中启动Activity  
  15.         i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
  16.         // 设置Intent启动的组件名称  
  17.         i.setClass(context, DisplayActivity.class);  
  18.         // 启动Activity显示通知  
  19.         context.startActivity(i);  
  20.     }  
  21.  

/Chapter08_Notification2/res/layout/main.xml

 

  
  
  
  
  1. 代码  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  5.     android:orientation="vertical" 
  6.     android:layout_width="fill_parent" 
  7.     android:layout_height="fill_parent" 
  8.     > 
  9.  
  10.     <Button   
  11.         android:text="发出广播"   
  12.         android:id="@+id/Button01"   
  13.         android:layout_width="wrap_content"   
  14.         android:layout_height="wrap_content"></Button> 
  15.  
  16. </LinearLayout> 

 

  
  
  
  
  1. 代码  
  2.  
  3. <?xml version="1.0" encoding="utf-8"?> 
  4. <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
  5.       package="com.amaker.ch08.app" 
  6.       android:versionCode="1" 
  7.       android:versionName="1.0"> 
  8.     <application android:icon="@drawable/icon" android:label="@string/app_name"> 
  9.         <activity android:name=".MainActivity" 
  10.                   android:label="@string/app_name"> 
  11.             <intent-filter> 
  12.                 <action android:name="android.intent.action.MAIN" /> 
  13.                 <category android:name="android.intent.category.LAUNCHER" /> 
  14.             </intent-filter> 
  15.         </activity> 
  16.           
  17.         <receiver android:name="MyReceiver"> 
  18.             <intent-filter> 
  19.                 <action android:name="com.amaker.ch08.app.MY_ACTION"/> 
  20.             </intent-filter> 
  21.         </receiver> 
  22.           
  23.         <activity android:name="DisplayActivity"/> 
  24.  
  25.     </application> 
  26.     <uses-sdk android:minSdkVersion="3" /> 
  27.  
  28. </manifest> 

 

你可能感兴趣的:(android,Broadcast,receive,广播事件处理)