Broadcast广播
广播 生命周期只有十秒左右
从[调用对象—实现onReceive—结束]
广播要创建一个类,继承BroadcastReceiver
在继承类重写 onReceive(Context context, Intent intent)
<intent-filter><action>
事件:
android.intent.action.MEDIA_UNMOUNTED :监听SD卡拔出
android.intent.action.BOOT_COMPLETED :开机启动
注意,一定要加上权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
android.intent.action.NEW_OUTGOING_CALL :手机拨号
注意,一定要加上权限
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
android.intent.action.PACKAGE_ADDED” : 监听安装
android.intent.action.PACKAGE_REMOVED” :监听卸载
<data android:scheme="package" /> :获得安装卸载的数据
BroadcastReceiver代码:
@Override
public void onReceive(Context context, Intent intent) {
// 获得监听 用来判断 是安装还是卸载
String listener = intent.getAction();
if ("android.intent.action.PACKAGE_ADDED".equals(listener)) {
// intent.getData().toString() 获得卸载包名
System.out.println(intent.getData().toString() + "已安装");
} else if ("android.intent.action.PACKAGE_REMOVED".equals(listener)) {
System.out.println(intent.getData().toString() + "已卸载");
}
BroadcastReceiver 有序与无序
有序
按照接收者的优先级顺序接收广播,优先级别在intent-filter中的priority中声明,-1000到
1000之间,值越大,优先级越高.可以终止广播意图的继续传播.接收者可以篡改内容.效率慢
无序
发送一个广播,所以监听该广播的广播接收者都可以监听到该广播。
无序广播 sendBroadcast(Intent intent)
自定义Broadcast
启动发送 sendBroadcast(intent);//无序广播
用Intent.setAction(“send”);自己建立频道
把自建频道写入到 <action android:name="自建频道" />
<receiver android:name=".sendBroadcastContent">
<intent-filter>
<action android:name="自建频道"></action>
</intent-filter>
有序广播
sendOrderedBroadcast(Intentintent,StringreceiverPermission,BroadcastReceiverresultReceiver,Handler scheduler, int initialCode, StringinitialData,BundleinitialExtras)
参数:
intent:意图
receiverPermission:接收方
resultReceiver:结果接收器 //new新建广播不用再AndroidManifest.xml声明,此参数监视最后广播得到的内容getResultData()
scheduler:调度器
initialCode:检测码
initialData:广播数据内容
initialExtras:临时增加捆绑
用Intent.setAction(“send”);自己建立频道
String data = getResultData(); 获得广播数据内容
setResultData(String); 篡改数据内容
abortBroadcast();拦截广播,将不再进行广播
把自建频道写入到 <action android:name="自建频道" />
设置优先级 <intent-filter android:priority="1000"/> 设置优先级 1000至-1000
<receiver android:name=".ShengBroadcast">
<!-- android:priority="1000" 设置优先级 1000至-1000 -->
<intent-filter android:priority="1000">
<action android:name="自建频道"></action>
</intent-filter>
</receiver>
在android里面有一些产生非常频繁的广播事件,在清单文件里面配置是不会生效.电量变化 屏幕锁屏/解锁 这些广播事件只能利用代码注册.
android.intent.action.SCREEN_OFF 屏幕锁定
android.intent.action.SCREEN_ON 屏幕解锁
<receiver android:name=".ScreenStatus">
<intent-filter>
<action android:name="android.intent.action.SCREEN_OFF"></action>
<action android:name="android.intent.action.SCREEN_ON">s</action>
</intent-filter>
</receiver>
// 接收广播
public class ScreenStatus extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
System.out.println("Action:" + action);
}
}
public class MainActivity extends AppCompatActivity {
private ScreenStatus status;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//自建的广播接收器
status = new ScreenStatus();
//意图过滤器
IntentFilter filter = new IntentFilter();
filter.addAction("android.intent.action.SCREEN_OFF");
filter.addAction("android.intent.action.SCREEN_ON");
//注册广播
registerReceiver(status, filter);
}
//销毁避免错误信息显示
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(status);
status = null;
}
}
手机屏蔽返回键
调用Main方法 onBackPressed():屏蔽返回键,去掉return便可
www.grepcode.com
查询旧版本源代码网站
无法快捷键出来,必须手输入,高版本已被隐藏掉
android.provider.Telephony.SMS_RECEIVED
注意,一定要加上权限
<uses-permission android:name="android.permission.RECEIVE_SMS" />
短信接收监听
//短信的数据是pdu的数据,必须对短信的格式很了解才可以解析短信.
Object[] objs = (Object[]) intent.getExtras().get("pdus");
for(Object obj : objs){
SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) obj);
String body = smsMessage.getMessageBody();
String sender = smsMessage.getOriginatingAddress();
System.out.println("body"+body);
System.out.println("sender"+sender);
}