Android Service 服务

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);
 * 
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值