android 学习随笔十七(服务 )
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 { @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
super.onDestroy();
} }- 清单文件中注册:<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 { @Override
public IBinder onBind(Intent intent) {
return null;
} @Override
public void onCreate() {
super.onCreate();
//获取电话管理器
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
//监听电话状态
tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
} class MyListener extends PhoneStateListener{
MediaRecorder recorder;
//电话状态改变时会调用
@Override
public 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
消息
android 学习随笔十七(服务 )的更多相关文章
- Android学习随笔--ListView的分页功能
		
第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...
 - android 学习随笔十八(广播与服务 )
		
1.广播接收者注册 清单文件注册(Android四大组件都要在清单文件中注册) 一旦应用部署,广播接收者就生效了,直到用户手动停止应用或者应用被删除 广播接收者可以使用代码注册 需要广播接收者运行时, ...
 - android 项目学习随笔十七(ListView、GridView显示组图)
		
ListView.GridView显示组图,处理机制相同 <?xml version="1.0" encoding="utf-8"?> <Li ...
 - android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )
		
JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...
 - Android 学习笔记 Service服务与远程通信...(AIDL)
		
PS:这一章节看的我有几分迷茫,不是很容易理解...不过还好总算是明白了一大半了...基本的迷惑是解决了... 学习内容: 1.跨应用启动服务... 2.跨应用绑定服务... 3.跨应用实现通信... ...
 - [android学习]android_gps定位服务简单实现
		
前言 gps定位服务的学习是这段时间gps课程的学习内容,之前老师一直在将概念,今天终于是实践课(其实就是给了一个案例,让自己照着敲).不过在照着案列敲了两遍之后,发现老师的案例是在是太老了,并且直接 ...
 - android 学习随笔二十二(小结)
		
ADB进程 * adb指令 * adb install xxx.apk * adb uninstall 包名 * adb devices * adb start-server * adb kill-s ...
 - android 学习随笔二十(多媒体编程 )
		
1.图片处理 加载大图片 图片大小的计算 图片大小 = 图片的总像素 * 每个像素占用的大小 * 单色图:每个像素占用1/8个字节* 16色图:每个像素占用1/2个字节* 256色图:每个像素占用1个 ...
 - android 学习随笔六(网络要求及配置)
		
android在4.0之后已经不允许在主线程执行http请求了. 主线程阻塞,应用会停止刷新界面,停止响应用户任何操作,耗时操作不要写在主线程 只有主线程才能修改UI ANR异常:Applicat ...
 
随机推荐
- SQL Server 未保存.sql文件,还想查看、修改一些建表语句、存储过程等怎么办?
			
SP_HELPTEXT 表名/视图名/存储过程名:
 - 解决在VMware中安装64位系统时“此主机具有虚拟化支持能力的,但虚拟化技术被禁用”的方法
			
您已经配置此虚拟机使用64位客户操作系统.然而,64位操作系统不可用.此主机具有虚拟化支持能力的,但虚拟化技术被禁用.这通常是因为虚拟化技术已经在BIOS /固件设置或禁用或主机没有权限改变此设置. ...
 - 【转】TableLayout(表格布局)
			
转自:http://www.cnblogs.com/zhangs1986/archive/2013/01/17/2864536.html TableLayout(表格布局) 表格布局模型以行列的形式管 ...
 - js- 千分位分割
			
// 千分位 console.log(split3str("123456789")) function splitByReg3(str) { var re = /(\d{1,3}) ...
 - 在Fedora8上配置Tomcat6.0.37
			
说是配置,其实很简单,解压拷贝是主要的活动,主要还是Tomcat做得很好很方便. 安装Tomcat的前提是把JDK装好,这和Win下是一样的.下面是整个步骤: 第一步,到Tomcat官网下载apach ...
 - 追加文件内容java
			
1.向空文件文件中追加内容(如果原来有内容,则覆盖) FileWriter writer; try { writer = new FileWriter(listFile);//创建字符输出流类对象和已 ...
 - php 使用 Memcache 例子
			
代码写成后不断的往数据库插入数据,可以发现 当set时:理论上速度变慢,但数据同步 当get时:理论上速度变快,但数据不同步,需要缓存失效后重新请求set方法 <?php $mem = new ...
 - [BS-15] Values of type 'NSInteger' should not be used as format arguments
			
Values of type 'NSInteger' should not be used as format arguments 苹果app支持arm64以后会有一个问题:NSInteger变成64 ...
 - Android --固定底部
			
相对布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns: ...
 - Vue 模板
			
界面: html: @using Abp.Web.Mvc.Extensions @{ ViewBag.CurrentPage = "BasicDatas"; } @section ...