1、Service

  • 四大组件之一
  • 运行于后台,没有前台界面的组件,用于运行需要在后台运行的代码
  • 可以理解为没有前台的Activity
  • 定义方式:创建java类继承Service,清单文件中注册该类
    1. package com.ecollab.runservice;
    2.  
    3. import android.app.Service;
    4. import android.content.Intent;
    5. import android.os.IBinder;
    6.  
    7. public class MyService extends Service {
    8.  
    9. @Override
    10. public IBinder onBind(Intent intent) {
    11. return null;
    12. }
    13.  
    14. @Override
    15. public void onCreate() {
    16. super.onCreate();
    17. }
    18.  
    19. @Override
    20. public int onStartCommand(Intent intent, int flags, int startId) {
    21. return super.onStartCommand(intent, flags, startId);
    22. }
    23.  
    24. @Override
    25. public void onDestroy() {
    26. super.onDestroy();
    27. }
    28.  
    29. }
  • 清单文件中注册:<service name="com.ecollab.runservice.MyService"/>

2、服务的启动和生命周期

  • 用户手动停止服务,服务不会重启,但是如果被自动关闭,内存充足就会重启
  • startService的生命周期
    • onCreate->onStartCommand->onDestroy
    • 重复的startService不会调用onCreate只会重复调用onStartCommand

public void start(View v) {
//启动服务,显示启动服务
Intent service = new Intent(this,MyService.class);
startService(service);
}

public void stop(View v) {
//停止服务
Intent service = new Intent(this,MyService.class);
stopService(service);
}

3、进程优先级

1. 前台进程:拥有一个正在与用户交互的Activity(onResume方法调用)
2. 可见进程:拥有一个不在前台但是对用户依然可见的Activity(onPause方法调用)
3. 服务进程:拥有一个通过startService启动的服务
4. 后台进程:拥有一个对于用户不可见的Activity(onStop方法调用)
5. 空进程:没有任何活动的应用组件(Activity和Service)

4、电话录音

  • 创建服务:
  1. package com.ecollab.runservice;
  2.  
  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.media.MediaRecorder;
  6. import android.os.IBinder;
  7. import android.telephony.PhoneStateListener;
  8. import android.telephony.TelephonyManager;
  9.  
  10. public class RecordService extends Service {
  11.  
  12. @Override
  13. public IBinder onBind(Intent intent) {
  14. return null;
  15. }
  16.  
  17. @Override
  18. public void onCreate() {
  19. super.onCreate();
  20. //获取电话管理器
  21. TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
  22. //监听电话状态
  23. tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
  24. }
  25.  
  26. class MyListener extends PhoneStateListener{
  27. MediaRecorder recorder;
  28. //电话状态改变时会调用
  29. @Override
  30. public void onCallStateChanged(int state, String incomingNumber) {
  31. super.onCallStateChanged(state, incomingNumber);
  32. //判断当前状态
  33. switch (state) {
  34. case TelephonyManager.CALL_STATE_IDLE:
  35. if(recorder != null){
  36. recorder.stop();
  37. //释放录音机占用的资源
  38. recorder.release();
  39. recorder = null;
  40. }
  41. break;
  42. case TelephonyManager.CALL_STATE_RINGING:
  43. recorder = new MediaRecorder();
  44. //设置声音来源
  45. recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
  46. //设置音频文件格式
  47. recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
  48. recorder.setOutputFile("sdcard/haha.3gp");
  49. //设置音频文件编码
  50. recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
  51. try {
  52. recorder.prepare();
  53. } catch (Exception e) {
  54. e.printStackTrace();
  55. }
  56. break;
  57. case TelephonyManager.CALL_STATE_OFFHOOK:
  58. if(recorder != null){
  59. recorder.start();
  60. }
  61. break;
  62. default:
  63. break;
  64. }
  65. }
  66. }
  67. }

RecorderService

  • 权限:

<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"/>

  • 注册:

<service android:name="com.ecollab.runservice.RecordService"></service>

  • 启动服务:

public void startrecord(View v) {
//启动录音机
Intent service = new Intent(this,RecordService.class);
startService(service);
}

5、服务两种启动方式

  • startService

* 开始服务,会使进程变成为服务进程
* 启动服务的activity和服务不再有关系

  • bindService

* 绑定服务不会使进程变成服务进程,通过bindService启动的服务,进程优先级不变
* 绑定服务,是activity与服务建立连接,如果activity销毁了,服务也会被解绑并销毁,但是如果服务被销毁,activity不会被销毁。不能做后台操作
* 绑定服务和解绑服务的生命周期方法:onCreate->onBind->onUnbind->onDestroy

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

conn = new MyConn();
}

public void start(View v){
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
public void stop(View v){
Intent intent = new Intent(this, MyService.class);
stopService(intent);
}
public void bind(View v){
Intent intent = new Intent(this, MyService.class);
//绑定服务
bindService(intent, conn, BIND_AUTO_CREATE);
}

public void unbind(View v){
//解绑服务
unbindService(conn);
}

class MyConn implements ServiceConnection{

//到服务的连接被建立了,此方法调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub

}

//到服务的连接中断了,此方法调用
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub

}

}
}

6、调用服务方法

不能直接调用服务中的方法, 可通过中间组件调用服务中的方法。

---------------------------------------------------------------------------------------------------

package com.itheima.leaderservice;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class LeaderService extends Service {

@Override
public IBinder onBind(Intent intent) {
// 返回中间人对象
return new FengMiShu();
}

class FengMiShu extends Binder implements PublicBusiness{
//中间人的牵线
@Override
public void qianXian(){
//调用领导的办证
banZheng();
}

public void takeSoap(){

}
}

public void banZheng(){
System.out.println("成功办证");
}
}

--------------------------------------------------------------------------------------------

package com.itheima.leaderservice;//定义接口为了:只有接口中的方法才允许被调用

public interface PublicBusiness {

void qianXian();
}

--------------------------------------------------------------------------------------------

public class MainActivity extends Activity {

// FengMiShu fms;
PublicBusiness pb;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent intent = new Intent(this, LeaderService.class);
bindService(intent, new ServiceConnection() {//不解除服务,可以直接newServiceConnection,如果要解除服务必须定义class MyConn implements ServiceConnection

//连接因为异常而终止才会调用
@Override
public void onServiceDisconnected(ComponentName name) {

}

//onBind有返回值此方法才会调用
//service:这个对象就是onBind返回的中间人
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
pb = (PublicBusiness) service;

}
}, BIND_AUTO_CREATE);
}

public void click(View v){
pb.qianXian();
}

}

7、混合启动

为了避免用bindService启动服务后,当activity销毁时,服务也被销毁,可以用混合启动,保证当activity销毁时,服务依然在运行

混合启动:先startService(intent);再bindService(intent,

startService(intent);

bindService(intent, ..............................解绑后不会摧毁服务,只有停止服务才会摧毁服务

服务的混合启动及摧毁顺序:start-bind-unbind-stop

消息

android 学习随笔十七(服务 )的更多相关文章

  1. Android学习随笔--ListView的分页功能

    第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...

  2. android 学习随笔十八(广播与服务 )

    1.广播接收者注册 清单文件注册(Android四大组件都要在清单文件中注册) 一旦应用部署,广播接收者就生效了,直到用户手动停止应用或者应用被删除 广播接收者可以使用代码注册 需要广播接收者运行时, ...

  3. android 项目学习随笔十七(ListView、GridView显示组图)

    ListView.GridView显示组图,处理机制相同 <?xml version="1.0" encoding="utf-8"?> <Li ...

  4. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

  5. Android 学习笔记 Service服务与远程通信...(AIDL)

    PS:这一章节看的我有几分迷茫,不是很容易理解...不过还好总算是明白了一大半了...基本的迷惑是解决了... 学习内容: 1.跨应用启动服务... 2.跨应用绑定服务... 3.跨应用实现通信... ...

  6. [android学习]android_gps定位服务简单实现

    前言 gps定位服务的学习是这段时间gps课程的学习内容,之前老师一直在将概念,今天终于是实践课(其实就是给了一个案例,让自己照着敲).不过在照着案列敲了两遍之后,发现老师的案例是在是太老了,并且直接 ...

  7. android 学习随笔二十二(小结)

    ADB进程 * adb指令 * adb install xxx.apk * adb uninstall 包名 * adb devices * adb start-server * adb kill-s ...

  8. android 学习随笔二十(多媒体编程 )

    1.图片处理 加载大图片 图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 * 单色图:每个像素占用1/8个字节* 16色图:每个像素占用1/2个字节* 256色图:每个像素占用1个 ...

  9. android 学习随笔六(网络要求及配置)

    android在4.0之后已经不允许在主线程执行http请求了. 主线程阻塞,应用会停止刷新界面,停止响应用户任何操作,耗时操作不要写在主线程   只有主线程才能修改UI ANR异常:Applicat ...

随机推荐

  1. 使用Aspose.Cell控件实现多个Excel文件的合并

    之前有写过多篇关于使用Apose.Cell控件制作自定义模板报表和通用的导出Excel表格数据的操作,对这个控件的功能还是比较满意,而且也比较便利.忽然有一天,一个朋友说:你已经有生成基于自定义模板报 ...

  2. LeetCode Best Time to Buy and Sell Stock IV

    原题链接在这里:https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/ 题目: Say you have an array ...

  3. Extjs4 获取到前一天的日期

    Extjs4 获取到前一天的日期 Extjs官方示例 Ext.Date add( date, interval, value ) : Date Provides a convenient method ...

  4. ComparatorChain、BeanComparator用法示例(枚举类型排序转)

    工作中遇到按照类的某个属性排列,这个属性是个枚举类型,按照要求的优先级排列. 可以使用ComparatorChain.BeanComparator.FixedOrderComparator实现. 举一 ...

  5. RedHat6.6更新Centos6yum源

    RedHat6.6更新Centos6yum源 一.    删除自带的RedHat6.6yum源 1-       rpm -qa|grep yum|xargs rpm -e --nodeps(不检查依 ...

  6. 转 awk中RS,ORS,FS,OFS区别与联系

     今天用到awk ofs 看到一篇不错文章 awk中RS,ORS,FS,OFS区别与联系 张映 发表于 2010-12-02 分类目录: shell 标签:awk, FS, OFS, ORS, RS, ...

  7. 第一篇 SQL Server代理概述

    本篇文章是SQL Server代理系列的第一篇,详细内容请参考原文. SQL Server代理是SQL Server的作业调度和告警服务,如果使用得当,它可以大大简化DBA的工作量.SQL Serve ...

  8. 【杂记】SQL篇

    21.事务 22.左联右联 23.大小写转换 24.MySql字符串拼接 25.查询数据库表总数 26.Oracle虚拟表 27.判断是否为空 28.SQL取diff 29.存储过程proc 30.创 ...

  9. django 一些库

    https://django-adminactions.readthedocs.io/en/latest/actions.html http://www.ziqiangxuetang.com/djan ...

  10. 【转】线程、Thread类和线程终止

    一.线程Thread启动 0. Thread类实现了java.lang.Runnable接口,即实现了run方法.虽然在Sun JDK中,start()调用了start0()方法,start0()方法 ...