广播(掌握)

  • 广播的概念

    • 现实:电台通过发送广播发布消息,买个收音机,就能收听
    • 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.itheima.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.itheima.smslistener.SmsReceiver">
    <intent-filter android:priority="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.itheima.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"/>
    </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.itheima.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.itheima.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. 服务进程:拥有一个通过startService方法启动的服务的进程
  4. 后台进程:拥有一个后台activity(onStop方法被调用)的进程
  5. 空进程:没有拥有任何活动的应用组件的进程,也就是没有任何服务和activity在运行

电话监听器(熟悉)

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

    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基础总结(七)的更多相关文章

  1. <Android 基础(七)> DrawerLayout and NavigationView

    介绍 DrawerLayout是Support Library包中实现了侧滑菜单效果的控件 android.support.v4.widget.DrawerLayout NavigationView是 ...

  2. Android基础总结(8)——服务

    服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...

  3. Android逆向-Android基础逆向(5)

    本文作者:i春秋作家——HAI_ 0×00 前言 不知所以然,请看 Android逆向-Android基础逆向(1)Android逆向-Android基础逆向(2)Android逆向-Android基 ...

  4. android基础---->DiskLruCache的使用及原理

    DiskLruCache是谷歌推荐的用来实现硬盘缓存的类,今天我们开始对于DiskLruCache的学习.DiskLruCache的测试代码:DiskLruCache的测试代码下载.关于FidkLru ...

  5. Android基础夯实--重温动画(一)之Tween Animation

    心灵鸡汤:真正成功的人生,不在于成就的大小,而在于你是否努力地去实现自我,喊出自己的声音,走出属于自己的道路. 摘要 不积跬步,无以至千里:不积小流,无以成江海.学习任何东西我们都离不开扎实的基础知识 ...

  6. Android基础测试题(四)

    看了前两道题大家有没有发现,测试题少了(一),大家猜猜测试题(一)是什么? Android基础测试题(四): 需求: 建一个方法,格式化输出2016-11-14 10:15:26格式的当前时间,然后截 ...

  7. Android基础测试题(二)

    今天给大家带来的是Android基础测试题(二) 题目要求: 定义一个5位长度的整型数组并初始化,然后构建方法根据用户传入的数字判断是否存在数组中,如果存在,返回所在位置,如果不存在,返回-1 首先第 ...

  8. Mono.Android 基础

    Mono.Android 基础 (地址) Mono.Android项目结构是 — Project + Assets + Resources + drawable + layout + values R ...

  9. 八、Android学习第七天——XML文件解析方法(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 八.Android学习第七天——XML文件解析方法 XML文件:exten ...

  10. 深入理解gradle编译-Android基础篇

    深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...

随机推荐

  1. servlet开发中遇到的问题集合

    问题1: servlet插入数据库时中文会乱码. 解决方法:在数据库连接地址最后增加两个转码参数(?useUnicode=true&characterEncoding=utf8) url=jd ...

  2. Mac入门(三)使用brew安装软件

    brew 又叫Homebrew,是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或者卸载软件, 只需要一个命令, 非常方便 brew类似ubuntu系统下的apt-get的功能 阅读目录 ...

  3. ASP.NET CORE配置信息

    做个笔记,原文链接 除了应用 IOptions<T> .Value的方式对配置信息进行全局注册外可以应用的另一个微软给出的组件,需要依赖两个包 Microsoft.Extensions.C ...

  4. AlloyTouch与three.js 3D模型交互

    如你所见,上面的cube的旋转.加速.减速停止都是通过AlloyTouch去实现的. 演示 代码 <script src="asset/three.js"></s ...

  5. [deviceone开发]-do_Album的简单示例

    一.简介do_Album用来打开手机系统提供的相册,能选择一张或多张图片返回给开发者,通常相册的图片比较大,要经过缩放.有的时候用户也需要把别的地方获取到到图片收藏到系统相册.这个示例简单展示这个组件 ...

  6. android基于口令加密快速搞懂(一)

    import java.util.Random; import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypt ...

  7. ASP.NET MVC 身份认证

    身份认证的好处就是, 如果这个页面没有登录, 刷新后会自动跳到登录页要求登录,保证了应用程序的安全.而Forms 身份认证是web下最常用的,如何配置呢?见下(基于mvc 4) 1.在webconfi ...

  8. mongodb 3.x 之实用新功能窥看[1] ——使用TTLIndex做Cache处理

    mongodb一直都在不断的更新,不断的发展,那些非常好玩也非常实用的功能都逐步加入到了mongodb中,这不就有了本篇对ttlindex的介绍, 刚好我们的生产业务场景中就有这个一个案例... 一: ...

  9. PHP相关笔记

    扩展包(相关链接):https://packagist.org/: 插件postman主要应用于web开发时get.post请求时查看其响应:

  10. linux 安装mysql数据库——yum安装法

    mysql数据库有多种安装方式,本文只介绍在Linux服务器上最实用.最快捷的mysql server安装方法.一.Linux服务器yum安装(CentOS6.3 64位) 所有在服务器上执行的命令, ...