1、Service

  • 四大组件之一
  • 运行于后台,没有前台界面的组件,用于运行需要在后台运行的代码
  • 可以理解为没有前台的Activity
  • 定义方式:创建java类继承Service,清单文件中注册该类
  • package com.ecollab.runservice;import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;public class MyService extends Service {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {super.onDestroy();}}

    View Code

  • 清单文件中注册:<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、电话录音

  • 创建服务:

package com.ecollab.runservice;import android.app.Service;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;public class RecordService extends Service {@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {super.onCreate();//获取电话管理器TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);//监听电话状态tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);}class MyListener extends PhoneStateListener{MediaRecorder recorder;//电话状态改变时会调用
        @Overridepublic void onCallStateChanged(int state, String incomingNumber) {super.onCallStateChanged(state, incomingNumber);//判断当前状态switch (state) {case TelephonyManager.CALL_STATE_IDLE:if(recorder != null){recorder.stop();//释放录音机占用的资源
                    recorder.release();recorder = null;}break;case TelephonyManager.CALL_STATE_RINGING:recorder = new MediaRecorder();//设置声音来源
                recorder.setAudioSource(MediaRecorder.AudioSource.MIC);//设置音频文件格式
                recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);recorder.setOutputFile("sdcard/haha.3gp");//设置音频文件编码
                recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);try {recorder.prepare();} catch (Exception e) {e.printStackTrace();}break;case TelephonyManager.CALL_STATE_OFFHOOK:if(recorder != null){recorder.start();}break;default:break;}}}
}

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

消息

转载于:https://www.cnblogs.com/ecollab/p/5910424.html

android 学习随笔十七(服务 )相关推荐

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

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

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

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

  3. android 学习随笔十二(网络:使用异步HttpClient框架)

    使用异步HttpClient框架发送get.post请求 在https://github.com/  搜索 asyn-http https://github.com/search?utf8=✓& ...

  4. android 学习随笔十六(广播 )

    1.广播接收者 BroadcastReceiver 接收系统发出的广播 现实中的广播:电台为了传达一些消息,而发送的广播,通过广播携带要传达的消息,群众只要买一个收音机,就可以收到广播了  Andro ...

  5. Android学习随笔 -- draw9patch的使用

    draw9patch的作用 通过draw9pacth生成的.9.png的图片的主要解决 在设计中 比如使用一个图片作为背景图片时,当要填充的区域 的长宽比例不同于图片的实际长宽比例时 图片会被拉伸的变 ...

  6. android学习笔记---42_服务的生命周期

    42_服务的生命周期 ------------------------- 与采用Context.startService()方法启动服务有关的生命周期方法 onCreate() onStart() ...

  7. Android学习笔记十七.使用ContentProvider实现数据共享(四).操作系统(联系人)的ContentProvider

        Android系统本身提供了大量的ContentProvider,例如联系人信息.系统的多媒体信息等,我们开发的应用程序主要是通过ContentResolver来调用系统的ContentPro ...

  8. android 学习随笔十三(网络:多线程下载)

    多线程断点续传下载 1.多线程:快 * 原理:抢占服务器资源 * 单线程下载:线程从第0个字节开始下,下到最后一个字节,在本地硬盘的临时文件中从第0个字节开始写,写到最后一个字节,下载完成时,临时文件 ...

  9. Dubbo学习记录(十七)-服务调用【三】- 服务消费端Invoker的包装

    服务消费端Invoker的包装 服务消费端的Invoker涉及到服务导出流程, 由ReferenceConfigde#get()方法生成一个代理实例Invoker返回: 这次目的的就是 把整个包装链路 ...

最新文章

  1. linux如何卸载挂载文件
  2. 万字长文总结机器学习的模型评估与调参 | 附代码下载
  3. Matplotlib Tutorial(译)
  4. centos 6.5升级openssl
  5. Shell替换:Shell变量替换,命令替换,转义字符
  6. 如何开启和使用windows 10中的Hyper-v
  7. 《TensorFlow 2.0深度学习算法实战教材》学习笔记(二、回归问题和分类问题)
  8. nullnullvc中加花
  9. 浅层介质过滤器工作原理介绍
  10. 邮件中的FYI和PFA代表什么意思
  11. 罗技 Logitech flow 连接
  12. 基于32单片机的智能插座
  13. 综述论文要写英文摘要吗_关于小论文的一些撰写建议!
  14. ad中按钮开关的符号_基础3:按钮开关,图文秒懂!
  15. 【P45】直流单电源24V JLH 1969 经典耳放参数优化
  16. 计算机分析报告摘要怎么写,计算机实践论文摘要怎么写 计算机实践论文摘要范文参考...
  17. alexa技能个数_如何使用Alexa蓝图创建自己的Alexa技能
  18. c语言来自不兼容指针类型的分配,c - 为什么我会收到“警告:来自不兼容指针类型的分配”? 结构数组中的双链表 - 堆栈内存溢出...
  19. ap协议java_总结无线AP与AC之间的各种问题
  20. 人民日报凭栏处:做一条有梦想的咸鱼

热门文章

  1. 编程小问题系列(6)——新年第一帖: 关于Silverlight在VS2010RC下无法正常运行的问题...
  2. 信号量的实现和应用实验报告_Java高级编程基础:原子信号量操作实现组线程执行管理...
  3. python requests max retries_我可以为request.request设置max_retries吗?
  4. android 中自定义安装,AndroidStudio 自定义配置
  5. 京东运营插件_技术中台产品经理必知的那些易混词儿(1):组件、套件、 中间件、插件……...
  6. 硬解析优化_解析!解析!598元的山灵动圈耳机大杀器,横评对比心慌慌
  7. 不同表结构数据迁移_数据结构:哈希 哈希函数 哈希表
  8. 发文件服务器空间满,针对服务器储存空间爆满而引发的宕机问题的解决方案
  9. 兄弟连html5在线画板,IT兄弟连 HTML5教程 HTML5做到了与之前版本的兼容
  10. 2020多校第1场A题【后缀数组+思维】