Android实训案例六.docx

上传人:b****8 文档编号:23939940 上传时间:2023-05-22 格式:DOCX 页数:14 大小:126.27KB
下载 相关 举报
Android实训案例六.docx_第1页
第1页 / 共14页
Android实训案例六.docx_第2页
第2页 / 共14页
Android实训案例六.docx_第3页
第3页 / 共14页
Android实训案例六.docx_第4页
第4页 / 共14页
Android实训案例六.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

Android实训案例六.docx

《Android实训案例六.docx》由会员分享,可在线阅读,更多相关《Android实训案例六.docx(14页珍藏版)》请在冰豆网上搜索。

Android实训案例六.docx

Android实训案例六

Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听

1.IP拨号器

我们在拨打电话的时候,我们系统也会事先发送一个广播,所以我们可以用广播接收者来接收到这个广播拨打电话的时候在电话号码前面加上一些优惠的长途短号,其逻辑就是入门使用广播的一个小案例,那我们新建一个IPCall项目

我们拨打电话的时候系统发一个广播,我们接受到这个广播拿到号码修改之后再放回去,就达到了我们IP拨号的目的,我们需要新建一个Receiver

CallReceiver

packagecom.lgl.ipcall;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.util.Log;

/**

*电话广播

*Createdbylglon16/4/10.

*/

publicclassCallReceiverextendsBroadcastReceiver{

//接收到广播时调用

@Override

publicvoidonReceive(Contextcontext,Intentintent){

Log.i("CallReceiver","打电话");

}

}

这个类暂时不需要做什么。

最重要的还是注册,作为四大组建,他是需要在清单文件里注册的

--注册广播-->

name=".CallReceiver">

--定义接收的广播-->

name="android.intent.action.NEW_OUTGOING_CALL"/>

别忘了,你监听了用户的隐私,是需要权限的

name="android.permission.PROCESS_OUTGOING_CALLS"/>

我们先运行一下,打个电话

好的,广播我们已经抓住了,那我们可以首先获取打出去的号码

Stringiphone=getResultData();

Log.i("CallReceiver","电话号码:

"+iphone);

这样我们就可以拿到String类型的电话号码了

我们现在可以修改号码重新设置IP段了

//添加IP段

StringnewPhone="+86"+iphone;

//把修改后的号码放回去

setResultData(newPhone);

这样我们每次打电话他都会自动帮我们添加一个字段了

完整代码

packagecom.lgl.ipcall;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.util.Log;

/**

*电话广播

*Createdbylglon16/4/10.

*/

publicclassCallReceiverextendsBroadcastReceiver{

//接收到广播时调用

@Override

publicvoidonReceive(Contextcontext,Intentintent){

Log.i("CallReceiver","打电话");

Stringiphone=getResultData();

Log.i("CallReceiver","电话号码:

"+iphone);

//添加IP段

StringnewPhone="+86"+iphone;

//把修改后的号码放回去

setResultData(newPhone);

}

}

2.短信拦截器

系统受到了一条短信后,也是会发一条广播的,所有我们可以在中间写一个广播接受者去进行我们的操作,这里,我们继续在IP拨号器这个项目中写吧,就不新建项目了,不然等下上传也麻烦

我们新建一个Class——SMSReceiver,重写他的onReceive方法,然后我们先注册

--注册广播-->

name=".SMSReceiver">

--定义接收的广播,被Google隐藏的权限操作-->

name="android.provider.Telephony.SMS_RECEIVED"/>

切記,权限

name="android.permission.RECEIVE_SMS"/>

SMSReceiver

packagecom.lgl.ipcall;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.os.Bundle;

importandroid.telephony.SmsMessage;

importandroid.util.Log;

/**

*短信拦截器

*Createdbylglon16/4/10.

*/

publicclassSMSReceiverextendsBroadcastReceiver{

@Override

publicvoidonReceive(Contextcontext,Intentintent){

System.out.println("收到短信");

//获取短信内容

Bundlebundle=intent.getExtras();

//返回的是一个Object数组

Object[]objects=(Object[])bundle.get("pdus");

//遍历数组得到短信内容

for(Objectobject:

objects){

//把数组元素转换成短信对象

SmsMessagesms=SmsMessage.createFromPdu((byte[])object);

//获取发件人号码

StringtoPhone=sms.getOriginatingAddress();

//获取短信内容

StringsmsContent=sms.getMessageBody();

Log.i("SMSReceiver","发件人号码:

"+toPhone+"短信内容"+smsContent);

//判断是否是拦截的号码

if(toPhone.equals("12345678910")){

//拦截广播

abortBroadcast();

}

}

}

}

这样我们运行之下,你会发现,虽然走到拦截这一步,但是并没有阻止显示在短信收件箱里,这里,我们要注意一个优势,就是广播接收者是有优先级定义的,我们只需要在清单注册根节点的intent-filter标签里定义一个

android:

priority="1000"

官方文档是说数值在-1000到1000之间,但是最高支持int的最大值的权限,int最大值是多少?

自己去看API

3.监听SD卡

我们在对SD卡进行读写的时候会用到,其实也就是巩固一下对广播的使用,做那种语音助手之类的辅助软件,广播和服务还是很有用的,我们还是定义一个SDReceiver并且在清单文件注册

--注册广播-->

name=".SDReceiver">

--SD卡就绪广播-->

name="android.intent.action.MEDIA_MOUNTED"/>

--SD卡拔出广播-->

name="android.intent.action.MEDIA_REMOVED"/>

--SD卡卸载广播-->

name="android.intent.action.MEDIA_UNMOUNTABLE"/>

scheme="file"/>

我们现在可以监听了

SDReceiver

packagecom.lgl.ipcall;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.util.Log;

/**

*监听SD卡

*Createdbylglon16/4/10.

*/

publicclassSDReceiverextendsBroadcastReceiver{

@Override

publicvoidonReceive(Contextcontext,Intentintent){

//判断广播

Stringaction=intent.getAction();

if(action.equals(Intent.ACTION_MEDIA_MOUNTED)){

Log.i("SDReceiver","SD卡就绪");

}elseif(action.equals(Intent.ACTION_MEDIA_REMOVED)){

Log.i("SDReceiver","SD卡拔出");

}elseif(action.equals(Intent.ACTION_MEDIA_UNMOUNTABLE)){

Log.i("SDReceiver","SD卡卸载");

}

}

}

4.流氓软件

我们监听到开机就启动这个软件,而且不让其退出,达到流氓的效果

先不让他退出,我们在MainActivity中

@Override

publicvoidonBackPressed(){

//禁止返回键

//super.onBackPressed();

}

只要你一安装,就退出不了了,我们再设置一下开机启动,写一个监听器动的广播罢了,我们新建一个RebootReceiver,先注册吧

--注册广播-->

name=".RebootReceiver">

--定义接收的广播-->

name="android.intent.action.BOOT_COMPLETED"/>

这个也是需要权限的

name="android.permission.RECEIVE_BOOT_COMPLETED"/>

RebootReceiver

packagecom.lgl.ipcall;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

importandroid.util.Log;

/**

*开机启动

*Createdbylglon16/4/10.

*/

publicclassRebootReceiverextendsBroadcastReceiver{

@Override

publicvoidonReceive(Contextcontext,Intentintent){

Log.i("RebootReceiver","开机");

//启动

Intenti=newIntent(context,MainActivity.class);

//在Activity之外启动需要设置Flags

i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.startActivity(i);

}

}

5.应用安装卸载监听

我们如果做手机助手或者应用的时候或许可以用得上这玩意,新建一个APPReceiver,然后去注册

--注册广播-->

name=".APPReceiver">

--安装应用-->

name="android.intent.action.PACKAGE_ADDED"/>

--更新应用-->

name="android.intent.action.PACKAGE_REPLACED"/>

--卸载应用-->

name="android.intent.action.PACKAGE_REMOVED"/>

--携带包名-->

scheme="package"/>

然后我们来判断

packagecom.lgl.ipcall;

importandroid.content.BroadcastReceiver;

importandroid.content.Context;

importandroid.content.Intent;

import.Uri;

importandroid.util.Log;

/**

*Createdbylglon16/4/10.

*/

publicclassAPPReceiverextendsBroadcastReceiver{

@Override

publicvoidonReceive(Contextcontext,Intentintent){

//判断广播类型

Stringaction=intent.getAction();

//获取包名

UriappName=intent.getData();

if(Intent.ACTION_PACKAGE_ADDED.equals(action)){

Log.i("APPReceiver","安装"+appName);

}elseif(Intent.ACTION_PACKAGE_REPLACED.equals(action)){

Log.i("APPReceiver","更新"+appName);

}elseif(Intent.ACTION_PACKAGE_REMOVED.equals(action)){

Log.i("APPReceiver","卸载"+appName);

}

}

}

这样我们完全就可以监听状态了,我们以下载一个豌豆荚为例

6.自定义广播

这里,我们有特定需求的时候会用,我们先定义一个Button

android:

id="@+id/btn_myreceiver"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

text="发送自定义广播"/>

他的点击事件就是发送一个广播,我这里自定义一个广播名字liuguilin

caseR.id.btn_myreceiver:

Intenti=newIntent();

i.setAction("liuguilin");

sendBroadcast(i);

break;

然后我们新建一个MyReceiver,注册

name=".MyReceiver">

--自定义广播-->

name="liuguilin"/>

我们写个打印语句

7.有序广播和无序广播

这两种广播的区别

有序广播:

接收这条广播是按优先级来的

无序广播:

无条件直接接收

-1.发送有序广播

我们定义一个Button

android:

id="@+id/btn_haveorder"

android:

layout_width="wrap_content"

android:

layout_height="wrap_content"

android:

text="发送有序广播"/>

然后发送一个广播

caseR.id.btn_haveorder:

Intentintent=newIntent();

intent.setAction("com.lgl.good");

//有序广播并且携带数据

sendOrderedBroadcast(intent,null,null,null,0,"自定义广播内容",null);

break;

这里我定义了三个广播,然后他们的优先级分辨是1000,600,300

--有序广播-->

name=".OrderReceiver">

priority="1000">

name="com.lgl.good"/>

--有序广播-->

name=".OrderReceiverTwo">

priority="600">

name="com.lgl.good"/>

--有序广播-->

name=".OrderReceiverThree">

priority="300">

name="com.lgl.good"/>

最后运行的结果

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 军事政治

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1