【Android基础】四、四大组件(二)

3.Service
Service
AIDL
Service两种启动方式:
1)startService():onCreate方法只调用一次,每次开启服务都会回调onStart方法,开启服务的进程被杀死后会自动重新启动,手动杀死不会重新启动。
2)bindService():onCreate,onBind,onUnbind,onDestroy只调用一次,只能绑定一次,绑定后只能解绑一次,可以通过定义的接口调用Service中的方法,绑定的Activity销毁,则Service关闭,可以通过混合开启Serivce使服务运行于后台。
AIDL接口用于远程服务的访问,需要在相同的包下面,是通过隐式启动来启动。
电话录音机:
监听电话状态要用TelephonyManager对象, 是一种系统服务,监听的事件是电话响铃状态,PhoneStateListener是一个类而非接口。录音使用的是MediaRecoder对象

TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 
tm.listen(new listener(),PhoneStateListener.LISTEN_CALL_STATE);
class listener extends PhoneStateListener{  
        @Override  
        public void onCallStateChanged(int state, String incomingNumber) {  
            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(getFilesDir() + "/" + "luyin.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;  
            }  
        }  
    }  
}  

四、ContentProvider
ContentProvider
一般很少需要自定义ContentProvider,自定义ContentProvider的话,需要重写query,insert,update,delete等方法,分别返回Cursor,Uri,int类型的数据,这些方法在访问时通过ContentResolver对象调用,需要传入的参数包括Uri和相应方法所需要的参数,这个Uri标识了提供数据的ContentProvider,这个Uri是在清单文件中配置的android:authorities属性,Uri后面可以跟path,通过匹配Uri,用来区分对不同的数据表的操作,在修改过表的数据后,还要通过getContext().getContentResolver().notifyChange(uri,null);这样才能使ContentObserver观察到数据的变化。
访问ContentProvider通过ContentResolver调用相应方法,
使用ContentResolver为指定Uri注册一个ContentObserver派生类:getContentResolver.registerContentObserver(uri,notifyForDescendents,ContentObserver)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值