Android 广播&服务

BroadCastReceiver

  • 广播接收者,Android四大组件之一
  • 用于接收广播Intent的,广播Intent的发送是通过调用sendBroadCast/sendOrderBroadCast来实现的,通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。

广播

  • Android中系统通过广播发布信息,只需要注册广播接受者
  • Android系统运行过程中可能产生很多事件,当这些事件发生时,系统希望通知到其他应用知道这个事件,所以会发出广播。
  • 如:开机、电量改变、收发短信、拨打电话、屏幕开关。

定义广播接收者

  • 必须在清单文件中配置
  • 通过<intent-filter>设置接收什么广播
  • 广播中包含一个intent,当广播发出时,系统会遍历
  • 如果广播接收者被用户手动停止,那么再也不会启动了。知道用户下一次手动启动该进程,广播接收者才会生效。

广播分类

无序广播:

  • 所有与广播中的Intent匹配的广播接收者都能收到这条广播,并且接收顺序不分先后
  • 无序广播不可以被拦截,如果拦截的话会报错
  • 无序广播使用sendBroadcast方法来发送

有序广播:

  • 所有与广播中的Intent匹配的广播接收者都能收到这条广播,但是要按照广播接收者的优先级
  • 有序广播可以被拦截,且优先级高的接收者可以拦截优先级低的
  • 广播接收者的优先级取值范围-1000(最低)~1000(最高)
  • 相同优先级下,接收的顺序要看在清单文件中声明的顺序,先声明的接收者比后声明的要先接收到广播。
  • 无序广播使用sendOrderedBroadcast方法来发送,使用abortBroadcast方法拦截
  • 广播接收者的优先级在清单文件中声明接收者时,在<intent-filter>标签下通过设置"android:property"属性来设置。

注册一个广播接收者有两种方式

静态注册

  • 在清单文件中添加如下配置

    <!-- 配置广播接收者 -->
    <receiver android:name="com.istarry.ipbohao.IpCallReceiver" >
        <intent-filter>
    
            <!-- 指定接收那个广播 -->
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            <!-- <data android:scheme=" " /> -->
        </intent-filter>
    </receiver>
    

动态注册:在java代码中注册

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter intentFilter = new IntentFilter("android.intent.action.MEDIA_UNMOUNTED");
        intentFilter.addDataScheme("file");
        registerReceiver(new IpCallReceiver(), intentFilter);
    }
}

注意:

  • java代码注册的广播接收者优先级要比清单文件的要高,但是当前的广播接收者的声明周期的期限和Activity是相关联的,Activity销毁,广播接收者也就不再起作用。
  • 通过清单文件注册的广播接收者在系统中运行一次后就会被注册到系统中,以后无需运行此广播接收者,但是也可以收的到广播。
  • 接收广播时要注意在清单文件中添加对应的权限。

IP拨号器

  • 需求:

    • 监听用户拨打电话,在用户拨打电话号码前加上17951
  • 1.拦截广播
            <!-- 指定接收(拦截)那个广播 -->
            <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
    
  • 2.需要的权限

    <uses-permission android:name="android.permission.PROCESSOUTGOINGCALLS" />

  • 3.创建一个类IpCallReceiver继承BroadCastReceiver
    public class IpCallReceiver extends BroadcastReceiver {
        //当收到广播时,此方法调用
        @Override
        public void onReceive(Context arg0, Intent arg1) {
            //添加17951线路
            //1.拿到用户拨打的号码
            //广播会发送一个Intent,携带数据
            String number = getResultData();
            //在号码前加上17951,并返回数据
            setResultData("17951"+number);
        }
    }
    
  • 4.在清单文件中注册广播接收者
       <application
        …… >
        …………
        <!-- 配置广播接收者 -->
            <receiver android:name="com.istarry.ipbohao.IpCallReceiver" >
             <!-- android:priority="1000"代表着给当前接收者设置优先级,优先级越高就越先接收到广播,取值-1000~1000 -->
                <intent-filter android:priority="1000">
    
                <!-- 指定接收那个广播 -->
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
                <!-- <data android:scheme=" " /> -->
              </intent-filter>
            </receiver>
        …………
    

Service

  • Service在Android中是一种长生命周期的组件,它不识闲任何用户界面,是一个没有界面的Activity。
  • Service长期在后台运行,执行不关乎界面的一些操作。比如:网易新闻服务,每隔一分钟去服务查看是否有最新新闻。
  • Service和Thread有点相似,但是使用Thread不安全,不严谨。
  • Service和其他组件一样,都是运行在主线程中,因此不能用它来做好事的操作

Android中的进程

Android中的进程种类

进程优先级由高到低,依次为:

  • 1. Foreground process 前台进程(拥有一个正在用户交互的Activity进程,即onResume()方法被调用)
  • 2. Visible process 可视进程,可以看见,但是不可以交互。(拥有一个不在前台但是依然可见的Activity,即onPause()方法被调用)
  • 3. Service process 服务进程(正在运行一个通过starService()方法启动的服务进程)
  • 4. Background process 后台进程(进Activity的onStop方法被调用)
  • 5. Empty process 空进程(当程序退出时,进程没有被销毁,而是变成了空进程)。即没有任何组件活动的进程(进程中没有服务也没有Activity)

进程的回收机制

Android

电话录音机

电话状态

TelephonyManager,设置PhoneStateListener监听状态

  • 空闲
  • 响铃
  • 摘机状态(接听)

权限

<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.istarry.luyinji.LuyinjiService" />

创建一个类LuyinjiService继承Service

public class LuyinjiService 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) getSystemService(TELEPHONY_SERVICE);
        // 设置侦听
        // 参数2:设置监听器只监听什么数据
        tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
    }
    private MediaRecorder recorder;
    class MyListener 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:
                System.out.println("空闲");
                if (recorder != null) {
                    // 停止录音
                    recorder.stop();
                    // 释放占用的资源
                    recorder.release();
                    recorder = null;
                }
                break;
            case TelephonyManager.CALL_STATE_RINGING:
                System.out.println("响铃");
                if (recorder == null) {
                    recorder = new MediaRecorder();
                    // 设置录音源
                    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                    // 设置录音格式3gp格式
                    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    // 设置录音文件保存位置
                    recorder.setOutputFile("sdcard/voice.3gp");
                    // 设置音频编码(一种格式可能有多重种编码方式)
                    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
                    try {
                        // 准备完毕,随时可以录音
                        recorder.prepare();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                break;
            case TelephonyManager.CALL_STATE_OFFHOOK:
                System.out.println("摘机");

                if (recorder != null) {
                    recorder.start();
                }
                break;
            }
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        return super.onStartCommand(intent, flags, startId);
    }
}
时间: 2024-10-12 23:25:20

Android 广播&服务的相关文章

Android 广播与服务

一,广播2种不同的注册方式的选择: Andorid 广播有手动注册与清单文件注册2种方式: 清单文件注册,不需要在代码中进行任何操作,甚至不需要实例化广播接收者.因为Android将会创建实例并管理它的生命周期.注意的是,接收onReceive()调用的实例只有在onReceive()的持续时间内有效.实际上,每个对onReceive()方法的调用都有可能是在不同的广播接收实例上进行.意味着必须避免异步调用其它类. 手动注册,必须在不用时注销广播,如果在一个活动中注销失败会导致一个异常,其中An

Xamarin.Android广播接收器与绑定服务

一.前言 学习了前面的活动与服务后,你会发现服务对于活动而言似乎就是透明的,相反活动对于服务也是透明的,所以我们还需要一中机制能够将服务和活动之间架起一座桥梁,通过本节的学习,你将会学到广播与绑定服务,这两种方式恰恰是解决上面问题的关键. 二.简单的广播接收器 实现一个最简单的广播接收器需要继承BroadcastReceiver类,并且还要实现OnReceive方法,我们可以在项目中新建一个MainReceiver类,然后写入如下代码: 1 public class MainReceiver :

Android广播机制(转)

1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内部的同一组件内的消息通信(单个或多个线程之间): 2.同一app内部的不同组件之间的消息通信(单个进程): 3.同一app具有多个进程的不同组件之间的消息通信: 4.不同app之间的组件之间消息通信: 5.Android系统在特定情况下与App之间的消息通

Android 广播的生命周期 &nbsp;

一:Android 广播的生命周期          一个广播接收者有一个回调方法:void onReceive(Context curContext, Intent broadcastMsg).当一个广播消息到达接收者是,Android调用它的onReceive()方法并传递给它包含消息的Intent对象.广播接收者被认为仅当它执行这个方法时是活跃的.当onReceive()返回后,它是不活跃的. 有一个活跃的广播接收者的进程是受保护的,不会被杀死.但是系统可以在任何时候杀死仅有不活跃组件的进

Android 定位服务(转载)

今天因为工作需要,把以前编写的一个GPS测试程序拿出来重新修改了一下.这个程序说起来有些历史了,是我11年编写的,那时候学了Android开发没多久,算是一个实验性的作品.现在工作需要,重新拿出来修整.同时发现我对android的GPS服务了解并不深,所以今天特意阅读了有关GPS服务的一些资料,把相关知识点记录下来. 本人做了GPS相关的嵌入式软件已经几年了,所以说起要做个测试GPS定位模块的程序,第一反应就是串口读取GPS模块的数据,然后解析GPS的NMEA格式数据.NMEA是一种标准化数据格

android广播集合,intent,action

android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问"properties"表在checkin数据库中,改值可以修改上传( Allows read/write access to the "properties" table in the checkin database, to change values that get uploaded) android.permission.ACCESS_COARSE_LOC

Android service 服务

Android的服务: 1:已启动方式: startService()和bindService(): startService:启动后,如果Activity关闭了,服务依然运行,除非stopService: bindService:创建开启服务器,但是在程序关闭的时候,会自动关闭服务: 通过ServiceConnectionjava接口获取service的IBinder接口: 2:控制服务(绑定服务): (1)但是上述两个方式都是通过Intent创建启动服务的,没有通过new,所以没有直接控制s

Android广播组件实践——短信黑名单

转载请注明出处:http://blog.csdn.net/chengbao315/article/details/51011358 相关阅读: Android服务组件案例:http://blog.csdn.net/chengbao315/article/details/50997218 上回书我提到了想要编写安卓四大组件案例的想法,那么说到做到,这次我就来做一个Android广播组件的案例.这次想要模仿手机360软件的短信黑名单功能,可以实现号码加入黑名单,后台运行程序,短信来到时进行拦截,并可

Android 定位服务(Location-Based Services)

Android定位服务融合了GPS定位.移动通信.导航等多种技术,提供与空间位置相关的综合应用服务.近些年来,基于位置的服务发展更为迅速,涉及商务.医疗.工作和生活的各个方面,为用户提供定位.追踪和敏感区域警告等一系列服务. Android平台支持提供位置服务的API,在开发过程中主要使用LocationManager和LocationProviders对象. - LocationManager: 用来获取当前位置,追踪设备的移动路线,或设定敏感区域,在进入或离开敏感区域时设备会发出特定警报.