注册BroadcastReceiver有两种方式:
一般如果在代码里面注册,就把广播写在代码里面,在xml文件中注册就单独写一个类。
动态注册:
一般在onResume()方法里面注册:
- packagecom.test;
- importandroid.app.Activity;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.content.IntentFilter;
- importandroid.os.Bundle;
- publicclassTestBroadcastReceiverextendsActivity
- {
- MyReceivermyReceiver;
- @Override
- publicvoidonCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- }
- @Override
- protectedvoidonResume()
- {
- myReceiver=newMyReceiver();
- IntentFilterfilter=newIntentFilter();
- //向过滤器中添加action
- filter.addAction("com.test");
- //注册广播
- registerReceiver(myReceiver,filter);
- Intentintent=newIntent();
- intent.setAction("com.test");
- intent.putExtra("key","value");
- //发送广播
- sendBroadcast(intent);
- super.onResume();
- }
- @Override
- protectedvoidonPause()
- {
- unregisterReceiver(myReceiver);
- super.onPause();
- }
- classMyReceiverextendsBroadcastReceiver
- {
- privatestaticfinalStringACTION_TEST="com.test";
- @Override
- publicvoidonReceive(Contextcontext,Intentintent)
- {
- if(intent.getAction().equals(ACTION_TEST))
- {
- Bundlebundle=intent.getExtras();
- System.out.println(bundle.get("key"));
- }
- }
- }
- }
package com.test; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; public class TestBroadcastReceiver extends Activity { MyReceiver myReceiver; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onResume() { myReceiver = new MyReceiver(); IntentFilter filter = new IntentFilter(); // 向过滤器中添加action filter.addAction("com.test"); // 注册广播 registerReceiver(myReceiver, filter); Intent intent = new Intent(); intent.setAction("com.test"); intent.putExtra("key", "value"); // 发送广播 sendBroadcast(intent); super.onResume(); } @Override protected void onPause() { unregisterReceiver(myReceiver); super.onPause(); } class MyReceiver extends BroadcastReceiver { private static final String ACTION_TEST = "com.test"; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(ACTION_TEST)) { Bundle bundle = intent.getExtras(); System.out.println(bundle.get("key")); } } } }
静态注册:在AndroidManifest.xml中用标签注册,并在标签内用标签设置过滤器。
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name">
- <activity
- android:label="@string/app_name"
- android:name=".TestBroadcastReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <receiverandroid:name=".MyReceiver">
- <intent-filter>
- <actionandroid:name="com.test"/>
- </intent-filter>
- </receiver>
- </application>
- publicclassMyReceiverextendsBroadcastReceiver
- {
- privatestaticfinalStringACTION_TEST="com.test";
- @Override
- publicvoidonReceive(Contextcontext,Intentintent)
- {
- if(intent.getAction().equals(ACTION_TEST))
- {
- Bundlebundle=intent.getExtras();
- System.out.println(bundle.get("key"));
- }
- }
- }
然后可在activity里发送广播。
----------------------------------------------------------------------------------------------------------------------------
上面是接受自定义的广播, 我们还可以接受系统发出的广播:
以下是个按下照相机之后,启动一个服务的例子:
1, 新建SimpleBoradcastReceiverextends BroadcastReceiver
- publicclassSimpleBoradcastReceiverextendsBroadcastReceiver
- {
- @Override
- publicvoidonReceive(Contextcontext,Intentintent)
- {
- Stringaction=intent.getAction();
- if(action.equals(Intent.ACTION_CAMERA_BUTTON))
- {
- //照相机按下后需要做的事,这里启动一个服务
- /**
- *如果broadcastreveiver需要处理耗时的任务,就应该启动一个服务而不是线程,
- *因为在执行完onReceive()方法后,BroadcastReceiver实例就即刻进入非活动状态,而被系统杀死。
- */
- context.startService(newIntent(context,SimpleService.class));
- }
- }
- }
2, 用MainActivity来启动SimpleBoradcastReceiver
- publicclassMainActivityextendsActivity
- {
- SimpleBoradcastReceiveraSimpleBoradcastReceiver=newSimpleBoradcastReceiver();
- /**Calledwhentheactivityisfirstcreated.*/
- @Override
- publicvoidonCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- //照相按钮的过滤器
- IntentFilterintentFilter=newIntentFilter(
- Intent.ACTION_CAMERA_BUTTON);
- //也可以继续增加你想要监听的行为
- intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
- //启动broadcastreceiver,使用registerReceiver()方法将intentFilter传递给它,启动以后只要有intentFilter里监听的行为发生,就会进入到aSimpleBoradcastReceiver的onReceive方法中去执行。
- registerReceiver(aSimpleBoradcastReceiver,intentFilter);
- }
- /**
- *如果销毁activity,receiver也要被释放掉(非必需,但很有用)。
- */
- @Override
- protectedvoidonPause()
- {
- super.onPause();
- unregisterReceiver(aSimpleBoradcastReceiver);
- }
- }
3, SimpleService
- publicclassSimpleServiceextendsService
- {
- @Override
- publicIBinderonBind(Intentarg0)
- {
- returnnull;
- }
- @Override
- publicvoidonCreate()
- {
- super.onCreate();
- //dosomething...
- }
- @Override
- publicvoidonDestroy()
- {
- super.onDestroy();
- //dosomething...
- }
- }
----------------------------------------------------------------------------------------------------------------------------
别人接收到的短信:
- IntentFilterfilter=newIntentFilter("android.provider.Telephony.SMS_RECEIVED");
- IncomingSMSReceiverreceiver=newIncomingSMSReceiver();
- registerReceiver(receiver,filter);
- publicclassIncomingSMSReceiverextendsBroadcastReceiver
- {
- privatestaticfinalStringSMS_RECEIVED="android.provider.Telephony.SMS_RECEIVED";
- @Override
- publicvoidonReceive(Contextcontext,Intentintent)
- {
- if(intent.getAction().equals(SMS_RECEIVED))
- {
- SmsManagersms=SmsManager.getDefault();
- Bundlebundle=intent.getExtras();
- if(bundle!=null)
- {
- Object[]pdus=(Object[])bundle.get("pdus");
- SmsMessage[]messages=newSmsMessage[pdus.length];
- for(inti=0;i<pdus.length;i++)
- messages[i]=SmsMessage.createFromPdu((byte[])pdus[i]);
- for(SmsMessagemessage:messages)
- {
- Stringmsg=message.getMessageBody();
- Stringto=message.getOriginatingAddress();
- sms.sendTextMessage(to,null,msg,null,null);
- }
- }
- }
- }
- }
在AndroidManifest.xml文件中添加以下权限:
- <uses-permissionandroid:name="android.permission.RECEIVE_SMS"/><!--接收短信权限-->
- <uses-permissionandroid:name="android.permission.SEND_SMS"/><!--发送短信权限-->
Android还有很多广播Intent,如:开机启动、电池电量变化、时间已经改变等广播Intent。
<wbr>接收电池电量变化广播Intent ,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:</wbr>
- <preclass="html"name="code"><receiverandroid:name=".IncomingSMSReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.BATTERY_CHANGED"/>
- </intent-filter>
- </receiver>
接收开机启动广播Intent,在AndroidManifest.xml文件中的<application>节点里订阅此Intent:
- <receiverandroid:name=".IncomingSMSReceiver">
- <intent-filter>
- <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
- </intent-filter>
- </receiver>
并且要进行权限声明:
- <uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
这样开机后onReceiver 就能收到开机的intent,然后自动启动你的service 或activity来做需要的事情