service服务、电话录音

服务: 长期后台运行的没有界面的组件

android应用:什么地方需要用到服务?

天气预报:后台的连接服务器的逻辑,每隔一段时间 获取最新的天气信息
股票显示:后台的连接服务器的逻辑,每隔一段时间 获取最新的股票信息
mp3播放器: 后台长期的播放音乐。


new Thread(){}.start(); 子线程没有界面,也是长期后台运行的。


android系统进程管理是按照一定的规则的:
1.应用程序一旦被打开 通常情况下关闭(清空任务栈)后进程不会停止。方便下一次快速启动。
带来内存不足的问题。
2.Android系统有一套 内存清理机制。 按照优先级去回收系统的内存。


进程分为5个等级的优先级:(从高到低)

应用程序:一组 组件(activity service provider receiver)的集合
一般情况 一个应用程序 会对应一个进程

一般情况 关闭掉应用程序, 关闭掉所有的界面,关闭所有的 activity
应用程序的进程 是不会关闭掉的,仍然在后台长期的运行

goole采用一组策略来管理进程
进程分为5个等级的优先级:(从高到低)

1.Foreground process 前台进程  用户正在玩的应用程序对应的进程
//用户可以看到这个进程里面某一个activity 的界面,可以操作这个界面

2.Visible process 可视进程 用户仍然可以看到这个进程的界面。
//用户仍然可以看到这个进程, 某个activity的界面,但是不可以操作这个界面

3.Service process服务进程  应用程序有一个服务组件在后台运行。


4.Background process 后台进程  应用程序没有服务在运行 并且最小化 (activity onstop)
//没有任务服务的进程,打开一个activity之后,按了home键, 最小化了

5.Empty process 空进程 没有任何运行的activity, 任务栈空了

自已开启的线程,当处于空进程是,是最容易被系统回收掉的

长期后台运行的组件, 不要在activity开启子线程。
应该是创建服务,在服务里面开启子线程。

服务的目的:
1.长期后台运行。
2.提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,把进程重新创建。
//服务只会被创建一次,如果服务已经创建了 并且没有销毁,
//多次调用 startservice 的方法 只会执行 onStartCommand() 和onStart()方法

//服务停止:
1.stopService()方法
2.手工停止掉
3.服务初始化操作:在onCreate()方法
3.服务停止的方法:onDestory()方法

    //开启服务
    public void click(View view){
        Intent intent = new Intent(this,MyService.class);
        startService(intent);
    }

/**
 * 长期在后台运行的组件,如查用户不手动关闭,不会停止的
 * 
 * @author zhangjianbin
 * 
 */
public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    // oncreate ondestory onstart onstop onresume onpause
    // 服务没有界面
    @Override
    public void onCreate() {
        System.out.println("服务创建了");
        super.onCreate();
        // 监视用户电话状的变化
        // 获取电话管理器 的服务
        TelephonyManager tManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

        /**
         * 监听 手机的通话状态的变化
         */
        tManager.listen(new MyPhoneStatusLinstent(),
                PhoneStateListener.LISTEN_CALL_STATE);

    }

    private class MyPhoneStatusLinstent extends PhoneStateListener {
        private MediaRecorder recorder;

        /**
         * 当 电话状态改变 时会调用这个方法
         * 
         * @param state
         *            :状态
         * @param incomingNumber
         *            :来里的电话号码
         */
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            try {
                switch (state) {
                case TelephonyManager.CALL_STATE_IDLE:// 空闲状态,没有通话 ,没有响铃
                    if (recorder != null) {
                        recorder.stop();
                        recorder.reset(); // You can reuse the object by going
                                            // back
                                            // to setAudioSource() step
                        recorder.release(); // Now the object cannot be reused

                        recorder = null;
                    }

                    break;
                case TelephonyManager.CALL_STATE_RINGING:// 响铃状态

                    // 1.创建出来一个 录音机
                    recorder = new MediaRecorder();

                    // 设置录制的音频源,从话筒里面获取声音
                    recorder.setAudioSource(MediaRecorder.AudioSource.MIC);

                    // 输出的文件格式的编码
                    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
                    // 声音格式的编码
                    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

                    // 音频保存在哪里 路径
                    recorder.setOutputFile("/sdcard/"
                            + System.currentTimeMillis() + ".3gp");

                    // 准备 状态
                    recorder.prepare();

                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:// 通话状态
                    if (recorder != null) {
                        recorder.start(); // Recording is now started
                    }
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            super.onCallStateChanged(state, incomingNumber);
        }

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        System.out.println("服务接收到了开启指令");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        System.out.println("服务销毁了");
        super.onDestroy();
    }
}

  <service android:name="com.itheima.testservice.MyService"></service>

//录音权限
   <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值