Android Service 服务

来源:互联网 发布:淘宝化妆品类目 编辑:程序博客网 时间:2024/05/21 09:39

Service 服务




清单文件中_注册:

<application 层中    <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"/>    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><service android:name="MyService"></service>




第一次写的服务:MyService.java

package com.bz.service;import java.text.SimpleDateFormat;import android.app.Service;import android.content.Intent;import android.media.MediaRecorder;import android.os.Binder;import android.os.IBinder;import android.telephony.PhoneStateListener;import android.telephony.TelephonyManager;import android.widget.Toast;public class MyService extends Service {    @Override    public void onCreate(){ //创建服务        super.onCreate();    }    @Override    public int onStartCommand(Intent intent, int flags, int startId){ //开启服务        //电话窃听器        TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);//获取TelephonyManager实例        tm.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);//注册电话的窃听        return super.onStartCommand(intent, flags, startId);        //return::START_STICKY:重启服务Intent为NULL/START_NOT_STICKY:无法自动重新启动/START_REDELIVER_INTENT:重启服务并传入Intent/START_STICKY_COMPATIBILITY:不能完全做到能自动重启服务    }    @Override    public void onDestroy(){ //关闭服务        super.onDestroy();    }    private MediaRecorder recorder = null; //录音机实例    //定义一个类用来监听电话的状态    private class MyPhoneStateListener extends PhoneStateListener{        //当电话状态发生改变时        @Override        public void onCallStateChanged(int state, String incomingNumber) {            switch (state) {            case TelephonyManager.CALL_STATE_IDLE: //空闲状态                if(recorder!=null){                    recorder.stop();    //停止录                    recorder.reset();   //重置                    recorder.release(); //释放资源                }                break;            case TelephonyManager.CALL_STATE_OFFHOOK: //接听状态                recorder.start();   //开始录                break;            case TelephonyManager.CALL_STATE_RINGING: //响铃状态                //准备录音机                recorder = new MediaRecorder(); //创建一个录音器实例                recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL); //设置音频来源 (MIC单方 VOICE_CALL双方)                recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置输出格式                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); //设置音频编码方式 如ACC                String str = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new java.util.Date());//获取当前时间                recorder.setOutputFile("/mnt/sdcard2/recording_"+str+".3gp"); //设置存放路径!!!                try {                    recorder.prepare(); //准备录                } catch (Exception e) {                    e.printStackTrace();                }                break;            default:                break;            }            super.onCallStateChanged(state, incomingNumber);        }    }    @Override    public IBinder onBind(Intent intent){ //绑定服务        //return null;        return new MyBinder(); //返回中间人    }    public void Tosat(){ //服务中的方法        Toast.makeText(getApplicationContext(), "界面调用服务的方法", 0).show();    }    //调用服务的方法的中间人 public   通过接口 private    private class MyBinder extends Binder implements IMyBinder{        public void goTosat(){Tosat();}    }}

服务中间人(接口对象):IMyBinder.java

package com.bz.service;public interface IMyBinder {    public void goTosat();}




开启服务

Intent intent = new Intent(this, MyService.class);startService(intent);//第二种开启服务的方法 绑定服务(不能在设置界面找到==隐藏的服务, 但会随界面的关闭而关闭(解绑的时候会销毁服务), 可以在Activity中调用Service的方法, 使用借口可以使一些方法暴露一些方法隐藏)//myConn = new MyConn();//bindService(intent, new MyConn(), BIND_AUTO_CREATE);//myBinder.goTosat(); //通过中间人调用服务里的方法




中间人

//MyBinder myBinder; //中间人IMyBinder myBinder; //接口的中间人//定义一个类 用来监视服务的状态private class MyConn implements ServiceConnection{    @Override    public void onServiceConnected(ComponentName name, IBinder service) {        System.out.println("服务绑定成功");        //通过中间人调用服务的方法        //myBinder = (MyBinder) service;        myBinder = (IMyBinder) service;    }    @Override    public void onServiceDisconnected(ComponentName name) {        System.out.println("服务解绑定成功");    }}




停止服务

Intent intent = new Intent(this, MyService.class);stopService(intent);//unbindService(myConn);//解绑服务




..

/* * 调用别的App的服务的方法: (如支付宝的支付) *  * 拥有服务的App: *  1.重命名暴露方法的借口 (本App中的IMyBinder.java), 重命名为.aidl (如IMyBinder.aidl), 去除所以public (因为aidl所有本来就是公有的,不需要加) *  2.服务中的子类 (MyBinder implements IMyBinder) 改为接口Stub (系统自动生成的,MyBinder implements Stub) *  * 要调用服务的App: *  1.创建一个名称‘有服务的包’一模一样的包(com.bz.service),把上面的.aidl文件复制到包里 *  2.绑定服务的方法为:Intent i = new Intent(); /n intent.setAction("上面App清单文件中服务的名称'com.bz.service.MyBootReceiver'"); bindService(i,new MyConn(), BIND_AUTO_CREATE); *  3.也要在清单文件注册这个服务哦 (com.bz.service.MyBootReceiver) *  4.获取中间人的方法改为:中间人对象 = Stub.asInterface(service); *  */
0 0
原创粉丝点击