1.广播接受者的概念
1:BroadcastReceiver是一个抽象类,用来接收sendBroadCast发出的广播。
2:其特点是数据单向传递,可扩散。
2.ip拨号器案例
1:写一个类继承BroadCastRevceiver重写onReceive方法。
2:清单文件中注册receiver节点,通过intent-filter拦截android.intent.action.NEW_OUTGOING_CALL广播事件。
3:添加android.permission.PROCESS_OUTGOING_CALLS权限。
public class MainActivity extends Activity {
private EditText ed_prefix;
private SharedPreferences sp;
@Override
protected void onCreate ( Bundle savedInstanceState) {
super . onCreate ( savedInstanceState) ;
setContentView ( R. layout. activity_main) ;
ed_prefix = ( EditText) findViewById ( R. id. ed_prefix) ;
Button btn_add = ( Button) findViewById ( R. id. btn_add) ;
sp = getSharedPreferences ( "info" , MODE_PRIVATE) ;
btn_add. setOnClickListener ( new OnClickListener ( ) {
@Override
public void onClick ( View v) {
String prefis = ed_prefix. getText ( ) . toString ( ) ;
if ( TextUtils. isEmpty ( prefis) ) {
Toast. makeText ( getApplicationContext ( ) , "前缀是空" , Toast. LENGTH_SHORT) . show ( ) ;
} else {
Editor edit = sp. edit ( ) ;
edit. putString ( "prefix" , prefis) ;
edit. commit ( ) ;
}
}
} ) ;
}
}
public class DailReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
SharedPreferences sp = context. getSharedPreferences ( "info" , Context. MODE_PRIVATE) ;
String number = getResultData ( ) ;
System. out. println ( "number" + number) ;
String prefix = sp. getString ( "prefix" , "100" ) ;
setResultData ( prefix + number) ;
}
}
< receiver android: name= " com.my.androidpro23.DailReceiver" >
< intent-filter>
< action android: name= " android.intent.action.NEW_OUTGOING_CALL" />
</ intent-filter>
</ receiver>
< uses-permission android: name= " android.permission.PROCESS_OUTGOING_CALLS" />
3.sd卡状态监听
public class SDCardStateReveiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
String action = intent. getAction ( ) ;
if ( "android.intent.action.MEDIA_MOUNTED" . equals ( action) ) {
System. out. println ( "挂载sd卡" ) ;
} else if ( "android.intent.action.MEDIA_UNMOUNTED" . equals ( action) ) {
System. out. println ( "去掉sd卡" ) ;
}
}
}
< receiver android: name= " com.my.androidpro23.SDCardStateReveiver" >
< intent-filter>
< action android: name= " android.intent.action.MEDIA_MOUNTED" />
< action android: name= " android.intent.action.MEDIA_UNMOUNTED" />
< data android: scheme= " file" />
</ intent-filter>
</ receiver>
4.来短信监听
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
Object[ ] objects = ( Object[ ] ) intent. getExtras ( ) . get ( "pdus" ) ;
for ( Object obj : objects) {
SmsMessage smsMessage = SmsMessage. createFromPdu ( ( byte [ ] ) obj) ;
String smsContent = smsMessage. getMessageBody ( ) ;
String from = smsMessage. getOriginatingAddress ( ) ;
System. out. println ( "from" + from + "短信内容:" + smsContent) ;
}
}
}
< uses-permission android: name= " android.permission.RECEIVE_SMS" />
< receiver android: name= " com.my.androidpro23.SmsReceiver" >
< intent-filter>
< action android: name= " android.provider.Telephony.SMS_RECEIVED" />
</ intent-filter>
</ receiver>
5.不同版本之间广播的特点
1:4.0之后没有运行的应用不能收到广播。
2:在应用管理器中强制停止(force stop)的应用不能收到广播。
6.应用安装和下载的监听
public class AppInstallReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
String action = intent. getAction ( ) ;
Uri data = intent. getData ( ) ;
System. out. println ( action + data) ;
}
}
< receiver android: name= " com.my.androidpro23.AppInstallReceiver" >
< intent-filter>
< action android: name= " android.intent.action.PACKAGE_ADDED" />
< action android: name= " android.intent.action.PACKAGE_REMOVED" />
< data android: scheme= " package" />
</ intent-filter>
</ receiver>
7.系统启动监听
public class BootRecevier extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
System. out. println ( "开启了" ) ;
Intent intent2 = new Intent ( context, MainActivity. class ) ;
intent2. setFlags ( Intent. FLAG_ACTIVITY_NEW_TASK) ;
context. startActivity ( intent2) ;
}
}
< receiver android: name= " com.my.androidpro23.BootRecevier" >
< intent-filter>
< action android: name= " android.intent.action.BOOT_COMPLETED" />
</ intent-filter>
</ receiver>
< uses-permission android: name= " android.permission.RECEIVE_BOOT_COMPLETED" />
8.发送无序广播
public void sendBroadcast ( View v) {
Intent intent = new Intent ( ) ;
intent. setAction ( "com.my.android23" ) ;
intent. putExtra ( "name" , "zhangsan" ) ;
sendBroadcast ( intent) ;
}
9.有序广播
public class MainActivity extends Activity {
@Override
protected void onCreate ( Bundle savedInstanceState) {
super . onCreate ( savedInstanceState) ;
setContentView ( R. layout. activity_main) ;
}
public void send ( View v) {
Intent intent = new Intent ( ) ;
intent. setAction ( "com.my.OrderedBroadcast" ) ;
String receiverPermission = null;
BroadcastReceiver resultReceiver = new FinalBroadcastReceiver ( ) ;
Handler scheduler = null;
int initialCode = Activity. RESULT_OK;
String initialData = "qwer100" ;
Bundle initialExtras = null;
sendOrderedBroadcast ( intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras) ;
}
}
public class FirstBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
String resultData = getResultData ( ) ;
Toast. makeText ( context, resultData, Toast. LENGTH_SHORT) . show ( ) ;
setResultData ( "qwer200" ) ;
}
}
public class SecondBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
String resultData = getResultData ( ) ;
Toast. makeText ( context, resultData, Toast. LENGTH_SHORT) . show ( ) ;
setResultData ( "qwer400" ) ;
}
}
public class ThirdBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
String resultData = getResultData ( ) ;
Toast. makeText ( context, resultData, Toast. LENGTH_SHORT) . show ( ) ;
setResultData ( "qwer200" ) ;
}
}
public class FinalBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
Toast. makeText ( context, "最后一个接收广告" , Toast. LENGTH_SHORT) . show ( ) ;
}
}
< receiver android: name= " com.my.androidpro24.FirstBroadcastReceiver" >
< intent-filter android: priority= " 100" >
< action android: name= " com.my.OrderedBroadcast" />
</ intent-filter>
</ receiver>
< receiver android: name= " com.my.androidpro24.SecondBroadcastReceiver" >
< intent-filter android: priority= " 80" >
< action android: name= " com.my.OrderedBroadcast" />
</ intent-filter>
</ receiver>
< receiver android: name= " com.my.androidpro24.ThirdBroadcastReceiver" >
< intent-filter android: priority= " 60" >
< action android: name= " com.my.OrderedBroadcast" />
</ intent-filter>
</ receiver>
10.有序广告和无序广告的比较
1:有序广告可以通过priority设置接收顺序,无序广告大家一起收到。
2:有序广告可以通过abortBroadcast()方法中断传播,无序广告不可以中断传播。
3:有序广告通过sendOrderedBroadcast()方法发送,无序广告通过sendBroadCast()发送。
4:可以通过是否可以被中断来判断有序广告和无序广告。
5:如果无序广告被中断,则会产生出现异常BroadcastReceiver trying to return result during a non-ordered broadcast。
11.广告的动态注册和静态注册
1:四大组件中,只有广告接收者可以不在清单文件中注册。
2:静态注册在清单文件中,通过声明receiver节点,并且指定intent-filter来注册。
3:动态注册通过registerReceiver()方法注册,unregisterReceiver()方法注销。
public class MainActivity extends Activity {
private BroadcastReceiver receiver;
@Override
protected void onCreate ( Bundle savedInstanceState) {
super . onCreate ( savedInstanceState) ;
setContentView ( R. layout. activity_main) ;
receiver = new ScreenLightBroadcastReceiver ( ) ;
IntentFilter filter = new IntentFilter ( ) ;
filter. addAction ( "android.intent.action.SCREEN_ON" ) ;
filter. addAction ( "android.intent.action.SCREEN_OFF" ) ;
registerReceiver ( receiver, filter) ;
}
@Override
protected void onDestroy ( ) {
super . onDestroy ( ) ;
unregisterReceiver ( receiver) ;
}
}
public class ScreenLightBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive ( Context context, Intent intent) {
String action = intent. getAction ( ) ;
if ( "android.intent.action.SCREEN_OFF" . equals ( action) ) {
System. out. println ( "屏幕关闭" ) ;
} else if ( "android.intent.action.SCREEN_ON" . equals ( action) ) {
System. out. println ( "屏幕亮了" ) ;
}
}
}