广播

  • 广播的概念

    • 现实:电台通过发送广播发布消息,买个收音机,就能收听
    • Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件。 Android系统在运行的过程中,会产生很多事件,比如开机、电量改变、收发短信、拨打电话、屏幕解锁

IP拨号器

原理:接收拨打电话的广播,修改广播内携带的电话号码 * 定义广播接收者接收打电话广播

public class CallReceiver extends BroadcastReceiver {

    //当广播接收者接收到广播时,此方法会调用
@Override
public void onReceive(Context context, Intent intent) {
//拿到用户拨打的号码
String number = getResultData();
//修改广播内的号码
setResultData("17951" + number);
}
}
  • 在清单文件中定义该广播接收者接收的广播类型

    <receiver android:name="com.ibky.ipdialer.CallReceiver">
    <intent-filter >
    <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
    </intent-filter>
    </receiver>
  • 接收打电话广播需要权限

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
  • 即使广播接收者的进程没有启动,当系统发送的广播可以被该接收者接收时,系统会自动启动该接收者所在的进程

短信拦截器

系统收到短信时会产生一条广播,广播中包含了短信的号码和内容

  • 定义广播接收者接收短信广播

    public void onReceive(Context context, Intent intent) {
    //拿到广播里携带的短信内容
    Bundle bundle = intent.getExtras();
    Object[] objects = (Object[]) bundle.get("pdus");
    for(Object ob : objects ){
    //通过object对象创建一个短信对象
    SmsMessage sms = SmsMessage.createFromPdu((byte[])ob);
    System.out.println(sms.getMessageBody());
    System.out.println(sms.getOriginatingAddress());
    }

    }

  • 系统创建广播时,把短信存放到一个数组,然后把数据以pdus为key存入bundle,再把bundle存入intent
  • 清单文件中配置广播接收者接收的广播类型,注意要设置优先级属性,要保证优先级高于短信应用,才可以实现拦截

    <receiver android:name="com.ibky.smslistener.SmsReceiver">   
      <intent-filter android:priority="1000"> //priority优先级:-1000~1000,1000是最大的
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>       //谷歌把这条自动提示屏蔽掉了,需要手打。
      </intent-filter> 
   </receiver>
  • 添加权限

    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
  • 4.0以后广播接收者安装以后必须手动启动一次,否则不生效

  • 4.0以后广播接收者如果被手动关闭,就不会再启动了

监听SD卡状态

  • 清单文件中定义广播接收者接收的类型,监听SD卡常见的三种状态,所以广播接收者需要接收三种广播

     <receiver android:name="com.ibky.sdcradlistener.SDCardReceiver">
    <intent-filter >
    <action android:name="android.intent.action.MEDIA_MOUNTED"/>   //就绪
    <action android:name="android.intent.action.MEDIA_UNMOUNTED"/> //被卸载
    <action android:name="android.intent.action.MEDIA_REMOVED"/> //被移除
    <data android:scheme="file"/> //这里必须带一个data,file为SD卡的路径
    </intent-filter>
    </receiver>
  • 广播接收者的定义

    public class SDCardReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    // 区分接收到的是哪个广播
    String action = intent.getAction(); if(action.equals("android.intent.action.MEDIA_MOUNTED")){
    System.out.println("sd卡就绪");
    }
    else if(action.equals("android.intent.action.MEDIA_UNMOUNTED")){
    System.out.println("sd卡被移除");
    }
    else if(action.equals("android.intent.action.MEDIA_REMOVED")){
    System.out.println("sd卡被拔出");
    }
    }
    }

勒索软件

  • 接收开机广播,在广播接收者中启动勒索的Activity
  • 清单文件中配置接收开机广播

    <receiver android:name="com.ibky.lesuo.BootReceiver">
    <intent-filter >
    <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
    </receiver>
  • 权限

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  • 定义广播接收者

    @Override
    public void onReceive(Context context, Intent intent) {
    //开机的时候就启动勒索软件
    Intent it = new Intent(context, MainActivity.class);
    context.startActivity(it);
    }
  • 以上代码还不能启动MainActivity,因为广播接收者的启动,并不会创建任务栈,那么没有任务栈,就无法启动activity
  • 手动设置创建新任务栈的flag

    it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

监听应用的安装、卸载、更新

原理:应用在安装卸载更新时,系统会发送广播,广播里会携带应用的包名 * 清单文件定义广播接收者接收的类型,因为要监听应用的三个动作,所以需要接收三种广播

    <receiver android:name="com.ibky.app.AppReceiver">
<intent-filter >
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REPLACED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>
  • 广播接收者的定义

    public void onReceive(Context context, Intent intent) {
    //区分接收到的是哪种广播
    String action = intent.getAction();
    //获取广播中包含的应用包名
    Uri uri = intent.getData();
    if(action.equals("android.intent.action.PACKAGE_ADDED")){
    System.out.println(uri + "被安装了");
    }
    else if(action.equals("android.intent.action.PACKAGE_REPLACED")){
    System.out.println(uri + "被更新了");
    }
    else if(action.equals("android.intent.action.PACKAGE_REMOVED")){
    System.out.println(uri + "被卸载了");
    }
    }

广播的两种类型

  • 无序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,并且是没有先后顺序(同时收到)
  • 有序广播:所有跟广播的intent匹配的广播接收者都可以收到该广播,但是会按照广播接收者的优先级来决定接收的先后顺序
    • 优先级的定义:-1000~1000
    • 最终接收者:所有广播接收者都接收到广播之后,它才接收,并且一定会接收
    • abortBroadCast:阻止其他接收者接收这条广播,类似拦截,只有有序广播可以被拦截

Service

  • 就是默默运行在后台的组件,可以理解为是没有前台的activity,适合用来运行不需要前台界面的代码
  • 服务可以被手动关闭,不会重启,但是如果被自动关闭,内存充足就会重启
  • startService启动服务的生命周期
    • onCreate-onStartCommand-onDestroy
  • 重复的调用startService会导致onStartCommand被重复调用

进程优先级

  1. 前台进程:拥有前台activity(onResume方法被调用)
  2. 可见进程:拥有可见activity(onPause方法被调用)
  3. 服务进程:不到万不得已不会被回收,而且即便被回收,内存充足时也会被重启
  4. 后台进程:拥有后台activity(activity的onStop方法被调用了),很容易被回收
  5. 空进程:没有运行任何activity,很容易被回收

电话窃ting器

  • 电话状态:空闲、响铃、接听
  • 获取电话管理器,设置侦听

    TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    tm.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
  • 侦听对象的实现

    class MyPhoneStateListener extends PhoneStateListener{
    
        //当电话状态改变时,此方法调用
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
    // TODO Auto-generated method stub
    super.onCallStateChanged(state, incomingNumber);
    switch (state) {
    case TelephonyManager.CALL_STATE_IDLE://空闲
    if(recorder != null){
    recorder.stop();
    recorder.release();
    }
    break;
    case TelephonyManager.CALL_STATE_OFFHOOK://摘机
    if(recorder != null){
    recorder.start();
    }
    break;
    case TelephonyManager.CALL_STATE_RINGING://响铃
    recorder = new MediaRecorder();
    //设置声音来源
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
    //设置音频文件格式
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
    recorder.setOutputFile("sdcard/haha.3gp");
    //设置音频文件编码
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
    try {
    recorder.prepare();
    } catch (IllegalStateException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    break;
    }
    }
    }

随堂笔记

Android四大组件

  • Activity
  • BroadcastReceiver
  • service
  • ContentProvider

广播

  • 现实

    • 电台通过播放广播,发布消息
    • 买个收音机,就能收到消息
  • Android
    • 系统在运行过程中,会产生很多事件:开机、拨打电话、收发短信、电量改变、屏幕解锁
    • 一旦发生这种事件,系统会发送一个广播,为了接收到这个广播,知道系统发生了什么事件,就需要广播接收者,功能类似收音机

IP拨号器

功能:拨打电话时,自动添加ip线路的号码前缀

原理:系统打电话时,会发送一个打电话广播,iP拨号器只要定义广播接收者接收这个广播,那么就可以知道用户什么时候打电话,打电话广播中还会包含用户拨打的号码,ip拨号器可以从广播中获取此号码,并且作出修改,也就是添加号码前缀


短信拦截器

功能:类似短信防火墙系统在收到短信时,会产生一条短信广播,短信广播里,包含了短信的发信人号码和短信的内容,短信应用之所以能收到短信,其实是收到了短信广播,那我们的短信拦截器,只要在短信应用拿到广播之前,把短信广播拦截,那么短信应用就不会收到广播


监听sd卡状态

sd卡状态改变时,系统会发送广播


应用安装、更新、卸载的监听

原理,系统在安装更新卸载时,系统都会产生广播,广播中带有应用的包名

两种广播

无序广播

  • 所有intent-filter与无序广播匹配的广播接收者都可以收到这条广播,并且没有先后顺序(可以理解为同时)

有序广播

  • 所有intent-filter与有序广播匹配的广播接收者都可以收到这条广播,但是有先后顺序,按照intent-filter中定义优先级来决定(-1000~1000)

服务

  • 默默运行在后台的组件,可以理解为没有前台的Activity,服务的作用就是用来运行需要在后台默默运行的代码

进程优先级

  1. 前台进程:拥有一个可以与用户交互的Activity(Activity的onResume方法调用)的进程
  2. 可见进程:拥有一个可见但无焦点的Activity(Activity的onPause方法被调用)的进程
  3. 服务进程:拥有一个通过startService方法启动的服务的进程
  4. 后台进程:拥有一个不可见Activity(Activity的onStop方法被调用)的进程
  5. 空进程:!拥有任何活动的组件(Activity、service)的进程

电话窃.听器

用户接到来电,一旦接听,立即开始录音,电话挂掉,录音结束,生成音频文件

  • 电话的状态

    • 空闲
    • 响铃
    • 摘机

Android应用开发基础之七:广播与服务(一)的更多相关文章

  1. Android应用开发基础篇(1)-----Button

    Android应用开发基础篇(1)-----Button   一.概述        Button,顾名思义就是按钮的意思,它主要的功能是响应用户按下按钮时的动作. 二.应用      新建一个工程, ...

  2. 20155305 2016-2017-2 《Java程序设计》实验四 Android程序开发基础

    实验四 Android开发基础 实验内容 基于Android Studio开发简单的Android应用并部署测试; 了解Android.组件.布局管理器的使用: 掌握Android中事件处理机制 实验 ...

  3. Android应用开发基础之八:广播与服务(二)

    服务两种启动方式 startService:服务被启动之后,跟启动它的组件没有一毛钱关系 bindService:跟启动它的组件同生共死 绑定服务和解绑服务的生命周期方法:onCreate->o ...

  4. Android学习之基础知识十四 — Android特色开发之基于位置的服务

    一.基于位置的服务简介 LBS:基于位置的服务.随着移动互联网的兴起,这个技术在最近的几年里十分火爆.其实它本身并不是什么时髦的技术,主要的工作原理就是利用无线电通讯网络或GPS等定位方式来确定出移动 ...

  5. android软件开发基础

    1.android特性:开放性:开源的一个基础, 方便性: 平等性: 2.Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,Broadc ...

  6. Android应用开发基础之十二:版本控制

    为什么需要版本控制? 场景1: 你的代码正常工作 你改了其中的几行代码 程序出了问题 你把代码改回来 程序还是不能正常工作——为什么? 场景2: 你的程序昨天还能正常运行 昨天晚上你修改了很多内容,做 ...

  7. Android应用开发基础之十:多媒体编程

    多媒体概念 文字.图片.音频.视频 计算机图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 单色图:每个像素占用1/8个字节 16色图:每个像素占用1/2个字节 256色图:每个像素 ...

  8. Android应用开发基础之一:数据存储和界面展现(一)

    Android项目的目录结构 Activity:应用被打开时显示的界面 src:项目代码 R.java:项目中所有资源文件的资源id Android.jar:Android的jar包,导入此包方可使用 ...

  9. Android Studio开发基础之自定义View组件

    一般情况下,不直接使用View和ViewGroup类,而是使用使用其子类.例如要显示一张图片可以用View类的子类ImageView,开发自定义View组件可分为两个主要步骤: 一.创建一个继承自an ...

随机推荐

  1. C++_异常1-调用abort()

    异常是相对较新的C++功能,有些老式编译器可能没有实现.另外有些编译器可能默认关闭这一特性,需要使用编译器选项来打开它. 这里先讨论一个基本问题: 2.0 * x * y / (x+y) 如果y是x的 ...

  2. docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled (Client.Timeout exceeded while awaiting headers).

    docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled ...

  3. python3 模块安装列表

    pip install scrapy pip install twisted pip install BeautifulSoup4 pip install lxml pip install Pillo ...

  4. gulp打包js

    在终端定位到你要创建目录的地方,输入 sudo mkdir js 创建文件夹,这个文件夹就是放你要压缩js文件的地方 输入 sudo vim gulpfile.js 这个js就是写gulp所有的配置信 ...

  5. C语言两种方式实现矩阵的转置

    #include"stdio.h" typedef struct{ int i,j; int v; }Triple; typedef struct{ Triple date[]; ...

  6. mysql explain工具使用

    explain工具可以确认执行计划是否良好,查询是否走了合理的索引.查询的执行计划,随着数据的变化也可能会有变化.调用方式:explain + [sql语句]. 另外,explain是有局限性的:1. ...

  7. NFS 优化及详解

    一, 启动过程: 所以启动的时候一定一定要先启用——————rpcbind———————————————— 启动 rpcbind  ------>/etc/init.d/rpcbind rest ...

  8. GreenPlum 大数据平台--运维(一)

    .最后分析或真空或创建表或等... Select * from pg_stat_operations where schemaname='SCHEMA NAME ' and actionname in ...

  9. elasticsearch清空type下的所有数据

    DELETE /twitter/tweet/_query{"query": { "match_all": {} }} 注:twitter为index,tweet ...

  10. nginx 导致文件上传中途中断 Failed to load resource: net::ERR_CONNECTION_RESET

    昨天上传文件出了问题,常常在进度条到一半的时候就终止了.在本地测试的时候倒是没问题,今天早上用花生壳换了另一个域名,在我本地和服务器都测试,却能够上传文件成功.然后就想到了可能是nginx的问题,也在 ...