关闭

Android 四大组件之Service简介 1

标签: androidservice
236人阅读 评论(0) 收藏 举报
分类:

Service

很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。为了处理这种后台进程,Android引入了Service的概念。
* Service 在android中是一种很长的生命周期组件,他不需要任何用户界面是一个没有界面的Activity。
* Service在后台运行,执行跟界面的操作无关,如:新闻服务,每隔一分钟去服务器查看是否有最新的新闻。
* Service和Thread优点相似,但Thread不安全。
* Service和其他组件一样都是在主线程中运行,不能用它来做耗时操作。

Android中的进程

进程优先级由高到低:
* 前台进程 foreground process
* 可视进程 (可以看见,但不可交互) Visible process
* 服务进程 Service process
* 后台进程 Background process
* 空进程 Empty process(当程序退出时进程没有被销毁,变成了空进程)

进程的回收机制

按优先级进行回收
* 进程的回收顺序是:从低到高
* 当系统内存不够用时, 会把空进程一个一个回收掉
* 当系统回收所有的完空进程不够用时, 继续向上回收后台进程, 依次类推
* 但是当回收服务, 可视, 前台这三种进程时, 系统非必要情况下不会轻易回收, 如果需要回收掉这三种进程, 那么在系统内存够用时, 会再给重新启动进程;但是服务进程如果用户手动的关闭服务, 这时服务不会再重启了。

服务和线程的区别

当程序退出时线程就会销毁,而服务不会被销毁
进程中运行着线程, Android应用程序刚启动都会开启一个进程给这个程序来使用。Android一个应用程序把所有的界面关闭时, 进程这时还没有被销毁, 现在处于的是空进程状态,Thread运行在空进程中, 很容易的被销毁了。
服务不容易被销毁, 如果非法状态下被销毁了, 系统会在内存够用时, 重新启动。

看了这么多理论,我们做个案例来点实际的(电话窃听器)

  • 新建一个工程MyServiceCall,在工程包中新建一个类:MyService继承Service 核心代码
public class MyService extends Service {

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

    /**
     * 创建一个服务
     */
    @Override
    public void onCreate() {
        System.out.println("服务已被创建");
        //创建一个电话管理者对象
        TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        //监听
        tm.listen(new MyPhoneLister(), PhoneStateListener.LISTEN_CALL_STATE);
        super.onCreate();
    }

    /**
     * 监听电话的状态
     * @author Blake
     *
     */
    class MyPhoneLister extends PhoneStateListener {

        private MediaRecorder recorder;
        private boolean flag = false;

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {

            super.onCallStateChanged(state, incomingNumber);
            if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
                // 录音
                System.out.println("开始通话");
                flag = true;
                // 新建一个MediaRecorder 对象
                recorder = new MediaRecorder();
                // 设置音频的来源
                recorder.setAudioSource(AudioSource.MIC);
                // 设置音频输入格式
                recorder.setOutputFormat(OutputFormat.THREE_GPP);
                // 设置音频编码
                recorder.setAudioEncoder(AudioEncoder.DEFAULT);
                // 设置日期格式
                SimpleDateFormat dateFormat = new SimpleDateFormat(
                        "yyyy-MM-dd_hh_mm_ss");
                String format = dateFormat.format(new Date());
                // 设置输出文件
                recorder.setOutputFile(getFilesDir() + "/" + format + ".3gp");
                // 准备录音
                try {
                    recorder.prepare();
                    // 开始录音
                    recorder.start();
                } catch (IllegalStateException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            } else if (TelephonyManager.CALL_STATE_IDLE == state && flag) {
                // 停止录音
                recorder.stop();
                recorder.release();
                flag = false;
                System.out.println("录音结束");
            }

        }
    }

}
  • 启动service
Intent service= new Intent();
service.setClass(this,MyService.class);
startService();
  • 权限和注册Service
 <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
     <service android:name="MyService">

        </service>

通过DDMS 来给模拟器打电话

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:34585次
    • 积分:825
    • 等级:
    • 排名:千里之外
    • 原创:49篇
    • 转载:5篇
    • 译文:0篇
    • 评论:1条
    欢迎来Star
    博客专栏