欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android四大组件之Service(服务)实例详解

程序员文章站 2023-12-18 09:09:04
本文实例讲述了android四大组件之服务用法。分享给大家供大家参考,具体如下: 很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在...

本文实例讲述了android四大组件之服务用法。分享给大家供大家参考,具体如下:

很多情况下,一些与用户很少需要产生交互的应用程序,我们一般让它们在后台运行就行了,而且在它们运行期间我们仍然能运行其他的应用。

为了处理这种后台进程,android引入了service的概念。service在android中是一种长生命周期的组件,它不实现任何用户界面。

基本概念

Ÿ   service是一种在后台运行,没有界面的组件,由其他组件调用开始。
Ÿ   创建service,定义类继承service,androidmanifest.xml中定义<service>
Ÿ   开启service,在其他组件中调用startservice方法
Ÿ   停止service,调用stopservice方法

1.在activity中调用service

/*
 * 开启服务
 */
public void start(view view) {
  intent intent = new intent(this, myservice.class);
  startservice(intent);
}
/*
 * 结束服务
 */
public void stop(view view) {
  intent intent = new intent(this, myservice.class);
  stopservice(intent);
}

2.定义service:

public class myservice extends service {
  /*
   * 绑定时调用
   */
  public ibinder onbind(intent intent) {
    return null;
  }
  /*
   * 开启服务时调用
   */
  public void oncreate() {
    super.oncreate();
    system.out.println("oncreate");
  }
  /*
   * 结束服务时调用
   */
  public void ondestroy() {
    super.ondestroy();
    system.out.println("ondestroy");
  }
}

3.在清单文件中进行定义服务

复制代码 代码如下:
<service android:name=".pmyservice" />

电话录音

电话录音是使用服务来实现的,在后台运行,使用监听器来监听电话的状态,当来电话时,监听器获取到来电话的电话号码,当用户接听后,就开始录音,当监听到电话的状态挂断后,停止录音,并将录音保存到sdcard中。

java代码:

@override
public void oncreate() {
  //拿到电话服务
  telephonymanager manager = (telephonymanager) getsystemservice(context.telephony_service);
  //电话的状态监听器
  manager.listen(new mylistener(), phonestatelistener.listen_call_state);
}
private final class mylistener extends phonestatelistener {
  private string num;
  private mediarecorder recorder;  //录音
  private file file;
  public void oncallstatechanged(int state, string incomingnumber) {
    switch (state) {
      //响铃状态
      case telephonymanager.call_state_ringing:
        //保存电话号
        num = incomingnumber;
        break;
      //接通电话状态
      case telephonymanager.call_state_offhook:
        try {
          //设置文件保存位置
          file = new file(environment.getexternalstoragedirectory(), num + "_" + system.currenttimemillis() + ".3gp");
          //创建录音器
          recorder = new mediarecorder();
          //设置音频的来源(麦克风)
          recorder.setaudiosource(audiosource.mic);
          //采取3gp格式保存
          recorder.setoutputformat(outputformat.three_gpp);
          //设置编码器
          recorder.setaudioencoder(audioencoder.amr_nb);
          //输出文件路径
          recorder.setoutputfile(file.getabsolutepath());
          //准备
          recorder.prepare();
          //录音
          recorder.start();
        } catch (exception e) {
          e.printstacktrace();
        }
        break;
      //电话空闲状态
      case telephonymanager.call_state_idle:
        //电话挂断后停止录音
        if (recorder != null) {
          recorder.stop();
          recorder.release();
        }
        break;
    }
  }
}

权限:

<!-- 读电话的状态权限 -->
<uses-permission android:name="android.permission.read_phone_state" />
<!-- 录音权限 -->
<uses-permission android:name="android.permission.record_audio" />
<!-- sdcard读的权限 -->
<uses-permission android:name="android.permission.mount_unmount_filesystems" />
<!-- sdcard写的权限 -->
<uses-permission android:name="android.permission.write_external_storage" />
<!-- 打开网络权限 -->
<uses-permission android:name="android.permission.internet" />

绑定本地服务

绑定本地服务实际上就是activity和服务进行绑定,activity一般是和用户进行交互,而服务一般是进行后台的工作,如果activity中需要访问服务中的一些方法,进行交互,这就需要进行绑定。

Ÿ   使用bindservice绑定服务,传入一个自定义的serviceconnection用来接收ibinder
Ÿ   定义一个业务接口,其中定义需要的使用的方法
Ÿ   服务中自定义一个ibinder继承binder并实现业务接口,在onbind方法中返回
Ÿ   调用端将ibinder转为接口类型,调用接口中的方法即可调用到服务中的方法

activity和service进行绑定示例:

activity:

public class mainactivity extends activity {
  private queryservice qs;
  private edittext edittext;
  public void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.main);
    edittext = (edittext) findviewbyid(r.id.id);
    // 绑定服务, 传入serviceconnection用来接收ibinder
    bindservice(new intent(this, personservice.class), new myconn(), bind_auto_create);
  }
  /*
   * 自定义的serviceconnection用来接收ibinder
   */
  private final class myconn implements serviceconnection {
    public void onserviceconnected(componentname name, ibinder service) {
      qs = (queryservice) service;
    }
    public void onservicedisconnected(componentname name) {
    }
  }
  /*
   * 根据id获取联系人
   */
  public void queryname(view view) {
    string id = edittext.gettext().tostring();
    string name = qs.query(integer.parseint(id));
    toast.maketext(this, name, 0).show();
  }
}

service:

public class personservice extends service {
  private string[] data = { "zxx", "lhm", "flx" };
  /*
   * 当绑定时调用此方法, 返回一个ibinder, 用来调用当前服务中的方法
   */
  public ibinder onbind(intent intent) {
    return new mybinder();
  }
  /*
   * 查询方法
   */
  public string query(int id) {
    return data[id];
  }
  /*
   * 自定义ibinder, 实现queryservice业务接口, 提供给调用者访问当前服务的方法
   */
  private final class mybinder extends binder implements queryservice {
    public string query(int id) {
      return personservice.this.query(id);
    }
  }
}

绑定远程服务

Ÿ   远程绑定服务时无法通过同一个接口来调用方法,这时就需要使用aidl技术
Ÿ   将接口扩展名改为“.aidl”
Ÿ   去掉权限修饰符
Ÿ   gen文件夹下会生成同名接口
Ÿ   将服务中自定义的ibinder类改为继承接口中的stub
Ÿ   serviceconnection中返回的ibinder是代理对象,不能使用强转,改用stub.asinterface()

希望本文所述对大家android程序设计有所帮助。

上一篇:

下一篇: