Android -- service 服务的创建与使用,生命周期,电话监控器

1. 为什么使用service

应用程序 : 一组组件(activity  service provider receiver)的集合.
一般情况 一个应用程序 会对应一个进程.
一般情况 关闭掉应用,  (关闭掉所有的界面 , 关闭所有的activity).
应用程序的进程 是不会被关闭掉的 仍然在后台长期的运行.

采用一组策略 帮助我们自动的管理进程.
进程 按照优先级分为不同的等级:
(1. 前台进程  用户可以看到这个进程里面某一个activity的界面. 可以操作这个界面
(2. 可见进程  用户仍然可以看到这个进程 某个activity的界面 ,但是 不可以操作这个界面
(3. 服务进程  如果一个应用程序 有一个服务在后台运行
(4. 后台进程  没有任何服务的进程 打开一个activity 之后 按了home键 最小化
(5. 空进程    没有任何活动组件 存在的进程.

 

2. 示例: 服务开启一个电话监控器

MainActivity.java 开启服务

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //开启服务
        Intent intent = new Intent(this,PhoneStatusService.class);
        startService(intent);        
    }
}

PhoneStatusService.java 服务代码 继承自Service

public class PhoneStatusService extends Service {
    /**
     * 长期在后台运行的组件,如果用户不手动的关闭 , 不会停止的.
     */
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("服务被创建了 ");
        // 监视用户电话状态的变化...
        // 电话管理器 电话管理的服务
        TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        // 监听手机的通话状态的变化
        tm.listen(new MyPhoneStatusLinstener(),
                PhoneStateListener.LISTEN_CALL_STATE);

    }

    private class MyPhoneStatusLinstener extends PhoneStateListener {
        private MediaRecorder recorder;

        @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
                        recorder.release(); // Now the object cannot be reused
                        recorder = null;
                    }

                    break;
                case TelephonyManager.CALL_STATE_RINGING: // 响铃状态.
                    System.out.println("发现来电号码 :" + incomingNumber);
                    // 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 void onDestroy() {
        super.onDestroy();
        System.out.println("服务被销毁了...");
    }

}

AndroidManifest.xml 注册服务 和 所需权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.itheima.callstatuslintener"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.itheima.callstatuslintener.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".PhoneStatusService"></service>
    </application>

</manifest>



posted @ 2014-04-03 13:55  今晚打酱油_  阅读(505)  评论(0编辑  收藏  举报