Android基础-07

Android基础-07 广播与服务

01_为什么需要广播接受者

电台:中央人民广播电台,93.4mhz; 收音机:93.4mhz,收听广播;

Android系统内置的电台,发送一些事件:接收短信、外拨电话、电量不足、电量充满、SD插拔、软件安装与下载等。

Android应用程序中的收音机:广播接收者,指定需要接收的事件类型; 可以做一些对用户有用的业务逻辑操作。

广播接收者的特点:

1、即使广播接收者没有运行,当广播事件到达的时候,系统会自动启动广播接收者,并且调用onReceive方法处理消息;
2、从android4.0之后,添加了一个新特点,如果强制停止就相当于冻结了这个程序,只能等到下次手工启动后才能生效;

02广播接受者案例ip拨号器(重点)

17951 139999999

步骤:

1、准备一个收音机:
    创建一个广播接收者的类,继承BroadcastReceiver:

        public class OutCallBroadcastReceiver extends BroadcastReceiver {
        public void onReceive(Context context, Intent intent) {
        }
        }
2、插上一块电池:
     <receiver android:name="com.itheima.ipdail.OutCallBroadcastReceiver"></receiver>
3、调整到一定的频道:
     <receiver android:name="com.itheima.ipdail.OutCallBroadcastReceiver">
        <intent-filter >
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        </intent-filter>
    </receiver>

4、添加权限到清单文件:
     <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

03广播接受者案例短信监听器(重点)

配置文件:

<receiver android:name="com.iheima.smslistener.SMSBroadcastReceiver">
    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>

</receiver>

代码:

package com.iheima.smslistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;

public class SMSBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        //接收短信的内容
        Object[] objs = (Object[]) intent.getExtras().get("pdus");
        for(Object obj : objs){
            SmsMessage sms = SmsMessage.createFromPdu((byte[]) obj);

            String content = sms.getMessageBody();

            String phone = sms.getOriginatingAddress();
            System.out.println("content=="+ content);
            System.out.println("phone=="+ phone);
        }

    }

}

04广播接受者案例sd卡状态监听(重点)

android2.3的模拟器上测试,4.0之后的版本上去掉了SD插拔的功能;

代码:

配置文件:

<receiver android:name="com.itheima.sdlistener.SDBroadcastReceiver">
    <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>

代码:

package com.itheima.sdlistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class SDBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {

    //得到广播的事件类型
    String action= intent.getAction();
    if("android.intent.action.MEDIA_MOUNTED".equals(action)){
        System.out.println("SD卡已经插上了............");
    }
    if("android.intent.action.MEDIA_UNMOUNTED".equals(action)){
        System.out.println("SD卡已拔掉了............");
    }

    if("android.intent.action.MEDIA_REMOVED".equals(action)){
        System.out.println("SD卡已经移除上了............");
    }
    }
}

05广播接受者案例开机启动(重点)

配置文件:

<receiver android:name="com.itheima.bootcomplete.BootCompleteBroadcastReceiver" >
    <intent-filter >
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

代码:

package com.itheima.bootcomplete;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.sax.StartElementListener;

public class BootCompleteBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        Intent i = new Intent(context,MainActivity.class);

        //告诉activity使用自己的任务栈来维护界面,如果任务栈中没有当前任务就户创建一个任务
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

        context.startActivity(i);
    }

}

06广播接受者案例卸载安装(重点)

配置文件:

<receiver android:name="com.itheima.azxzlistener.AZXZBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_INSTALL" />
        <action android:name="android.intent.action.PACKAGE_REMOVED" />
        <action android:name="android.intent.action.PACKAGE_REPLACED" />
        <!-- 这个属性必须添加 -->
        <data android:scheme="package"/>
    </intent-filter>
</receiver>

代码:

package com.itheima.azxzlistener;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class AZXZBroadcastReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();

    if("android.intent.action.PACKAGE_INSTALL".equals(action)){
        System.out.println("有一个新软件安装了...........");
    }
    if("android.intent.action.PACKAGE_REMOVED".equals(action)){
        System.out.println("有一个软件卸载了...........");
    }
    if("android.intent.action.PACKAGE_REPLACED".equals(action)){
        System.out.println("有一个软件升级了...........");
    }
    }

}

07_发送自定义广播

示例代码:

代码:

Intent intent = new Intent();
intent.putExtra("news", "我是广播");
//给广播顶一个事件类型
intent.setAction("com.itheima.selfbroadcast.SBC");
//发送广播消息
sendBroadcast(intent);

08_有序广播和无序广播(重点)

有序广播:

广播发送的消息会按照广播接收者的优先级从高到低一级一级的发放消息。
        消息可以被拦截,被修改;

无序广播:

广播发送的消息发送出去后,只要广播接收者指定了它的事件类型,都可以接收到这个消息。
        消息不能被拦截;

代码:

Intent intent = new Intent();

intent.setAction("com.itheima.FFNTBT");
//发送一个有序的广播
//intent 传递数据的意图对象
//receiverPermission 指定了只有这个权限的广播接收者才能接收到这个消息
//resultReceiver 指定了哪个广播接收者最后接收到消息
//scheduler 消息处理器
//initialCode 初始的消息码
//initialData 初始数据
//initialExtras 发送的额外数据
sendOrderedBroadcast(intent, null, null, null, 1, "我是国务院,发放2014年农田补贴,每亩地补贴900元", null);

09_服务和进程优先级

服务:是一个没有界面,可以长期运行在后台的应用程序(没有界面的activity);

服务的特点:

(1)android4.0之后的版本上,需要带有服务的应用程序必须要有一个界面,并且在至少运行过一次,否则不生效;
(2)是一个没有界面,可以长期运行在后台的应用程序;

进程:运行应用程序的载体。当应用程序一启动的时候,android操作系统就提供一个linux的进程,进程是负责维护dalvik虚拟机的,而我们开发的应用程序试运行在dalvik虚拟机上的。

应用程序:四大组件放在一起就是应用程序。

进程的特点:

(1)应用程序启动时创建了进程;
(2)应用程序退出的时候,进程并没有退出;
(3)手工结束进程;当可用内存空间不足,系统会自动清理没有用到的进程;

进程的等级:

1. Foreground process(前台进程)

    应用程序,用户正在操作,activity的onresume方法被执行了,可以相应点击事件。

2. Visible process   (可视进程)

        应用程序的ui界面,用户还可以看到,但是不能操作了。

3. Service process   (服务进程)

        应用程序没有界面,但是有一个后台的服务还处于运行状态

4. Background process(后台进程)

        应用程序没有服务处于运行状态,应用程序被最小化了,activity执行了onstop方法

5. Empty process      (空进程)

        没有任何组件运行,所有的activity都关闭了,任务栈清空了

10_服务的特点

特点:

1、第一次开启服务时,会创建一个服务对象:oncreate,开启服务会调用onstartCommand;
2、停止服务时调用ondestroy方法;
3、服务只能被创建一次,可以多次开启,每次开启时都会调用onstartCommand方法;
4、服务只能停止一次,如果多次停止不会执行任何操作;

11_电话窃听器的模板代码(重点)

12_利用服务实现电话窃听器

代码:

package com.itheima.phonelistener;

import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Environment;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class PhoneListenerService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();

            //得到系统提供的电话服务对象
                TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);

                //监听电话状态
                //listener 电话状态的监听器
                //LISTEN_CALL_STATE 监听的事件类型
                tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
    }

    private class MyListener extends PhoneStateListener {

        private MediaRecorder r;

        /**
         * 当电话状态发生变化时调用这个方法 state 电话状态:铃声响起、接通电话、闲置状态
         */
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
            switch (state) {
            case TelephonyManager.CALL_STATE_IDLE:// 空闲状态
                if(r != null){
                    //停止录音
                    r.stop();
                    //释放多媒体对象
                    r.release();
                    //让垃圾回收器回收多媒体对象占用的资源
                    r = null;
                }
                break;

            case TelephonyManager.CALL_STATE_RINGING:// 铃声响起状态
                try {
                    //创建一个录音机的对象
                    r = new MediaRecorder();
                    //设置音频的来源
                    r.setAudioSource(MediaRecorder.AudioSource.MIC);
                    //设置输出文件的格式
                    r.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    //设置文件保存的路径
                    r.setOutputFile(Environment.getExternalStorageDirectory()+"/123.3gp");
                    //设置音频文件的编码
                    r.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

                    //准备多媒体对象
                    r.prepare();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                break;

            case TelephonyManager.CALL_STATE_OFFHOOK:// 接通状态
                if(r != null){
                    //开始录音
                    r.start();
                }
                break;
            default:
                break;
            }
        }
    }
}

配置文件:

权限:

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>

<service android:name="com.itheima.phonelistener.PhoneListenerService"></service>
时间: 2024-11-08 09:52:33

Android基础-07的相关文章

Android基础入门教程——1.6 .9(九妹)图片怎么玩

Android基础入门教程--1.6 .9(九妹)图片怎么玩 标签(空格分隔): Android基础入门教程 1.本节引言: 可能有的一些疑问: 1.什么是.9图片? 答:图片后缀名前有.9的图片,如pic1.9.png这样的图片 2. .9图片能干嘛? 答: 在图片拉伸的时候特定的区域不会发生图片失真,而不失真的区域可以由我们自己绘制 3. .9图片用什么做? 答:工欲善其事,必先利其器,做.9图片的工具有: ①Android SDK自带:draw9patch.bat,不过这玩意出了好久,谷歌

Android基础01 快速入门 &amp; 布局

Android基础01 快速入门 & 布局 01.01  手机制式 第一代模拟制式手机(1G):1G就是大哥大,手机类似于简单的无线电双工电台,通话是锁定在一定频率,所以使用可调频电台就可以窃听通话.   第二代GSM.CDMA等数字手机(2G):手机使用PHS,GSM或者CDMA这些十分成熟的标准,具有稳定的通话质量和合适的待机时间,支持彩信业务的GPRS和上网业务的WAP服务,以及各式各样的Java程序等. 第三代移动通信技术(3G):3G,是英文3rd Generation的缩写,指第三代

Android逆向-Android基础逆向(2-2)

[toc] #0x00 前言##不知所以然,请看Android逆向-Android基础逆向(1)Android逆向-Android基础逆向(2)##以及java系列:Android逆向-java代码基础(1)Android逆向-java代码基础(2)Android逆向-java代码基础(3)Android逆向-java代码基础(4)Android逆向-java代码基础(5)Android逆向-java代码基础(6)Android逆向-java代码基础(7)Android逆向-java代码基础(8

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert

Android基础入门教程——2.3.12 Date &amp; Time组件(下)

Android基础入门教程--2.3.12 Date & Time组件(下) 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来继续学习Android系统给我们提供的几个原生的Date & Time组件,他们分别是: DatePicker(日期选择器),TimePicker(时间选择器),CalendarView(日期视图),好吧, 其实一开始让我扣这几个玩意我是拒绝的,因为在我的印象里,他们是这样的: 简直把我丑哭了,有木有,终于知道为什么那么多人喜欢自定义这种类型的

Android基础入门教程——2.1 View与ViewGroup的概念

Android基础入门教程--2.1 View与ViewGroup的概念 标签(空格分隔): Android基础入门教程 本节引言: 告别了第一章,迎来第二章--Android中的UI(User Interface)组件的详解, 而本节我们要学习的是所有控件的父类View和ViewGroup类!突发奇想,直接翻译官方文档对 这两个东西的介绍吧,对了,天朝原因,google上不去,Android developer上不去,我们可以 改hosts或者用vpn代理,当然也可以像笔者一样使用国内的API

2015年最新Android基础入门教程目录(完结版)

2015年最新Android基础入门教程目录(完结版) 标签(空格分隔): Android基础入门教程 前言: 关于<2015年最新Android基础入门教程目录>终于在今天落下了帷幕,全套教程 共148节已编写完毕,附上目录,关于教程的由来,笔者的情况和自学心得,资源分享 以及一些疑问等可戳:<2015最新Android基础入门教程>完结散花~ 下面是本系列教程的完整目录: 第一章:环境搭建与开发相关(已完结 10/10) Android基础入门教程--1.1 背景相关与系统架构