桌面应用程序:可见
服务:不可见 长期在后台运行 帮助应用执行耗时的操作
安卓的服务:安卓四大组件之一 不可见 后台长期运行 界面与服务有时候要执行数据交互
创建一个类 继承Service.
package com.li.servce;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;
public class MyService extends Service{
//Service启动时调用
@Override
public void onCreate() {
super.onCreate();
Log.v("wang", "OnCreate 服务启动时调用");
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
//服务被关闭时调用
@Override
public void onDestroy() {
super.onDestroy();
Log.v("wang", "onDestroy 服务关闭时");
}
}
四大组件多需要配置配置
<service android:name="com.li.servce.MyService"></service> <!--绑定一个服务类-->
调用服务器
package com.li.servce;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void createServiceClick(View v){
Intent intent = new Intent(this,MyService.class);
//启动servicce服务
startService(intent);
}
//虽然应用界面已经退出 但是服务还是存在的
//停止服务 可以通过按钮来关闭 可以通过代码关闭服务
public void clickStopService(View v){
Intent name= new Intent(this,MyService.class);
stopService(name);//name表示停止哪一个服务
}
}
电话窃听器原理
开发步骤:
-
创建一个后台运行的服务
-
启动应用的时候启动服务
-
在onCreate()调用的时候 创建一个系统的服务 并获取电话的状态
TelephonyManagermanager=(TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
//1. 注册监听器 2. 监听的事件
代码
package com.li.callMyVoce;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
public class CallService extends Service{
@Override
public void onCreate() {
super.onCreate();
//开始时刻接听用户电话状态 休闲(没有接听电话) 邻响 接通 挂断
//如果自己去写代码接通用户状态 会很复杂 的操作 求系统
//系统服务getSystemService(name) 电话有关的服务 服务的后缀一般以service manager ...作为后缀
//TelephonyManager 他表示可以接听各种各样跟手机有关的很多服务 他表是一个大的概念
TelephonyManager manager=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
//manager.listen(listener, events)
manager.listen(new PhoneStateListener(){ //listener表是接听手机的那个状态比如说接听电话的服务new PhoneStateListenter()//重写方法等等
@Override
public void onCallStateChanged(int state, String incomingNumber) {//incomingNumber表示电话号码 只有来点时才有值
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
Log.v("wang", "CALL_STATE_IDLE 休闲状态 挂断");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.v("wang", "CALL_STATE_OFFHOOK 接通");
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.v("wang", "CALL_STATE_RINGING 电话铃声响状态"+incomingNumber);
break;
}
}
}, PhoneStateListener.LISTEN_CALL_STATE);
// events 就是要指定对那些事件比较关心
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
}
调用
package com.li.callMyVoce;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.时时刻刻的接听用户当前的打电话状态 ----> Service
//2.当用户开启接听电话的时候 开始录音 用户挂断了电话停止录音--->录音功能
//3.当发现网络状态(广播 判断是否有网络)是开着的时候就应该发送录音到后台服务器
}
public void clickService(View v){
Intent intent = new Intent(this,CallService.class);
startService(intent);
}
}
配置文件里面的铭感操作
<!-- 绑定服务器 -->
<service android:name="com.li.callMyVoce.CallService"></service>
<!-- 电话的铭感操作 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
服务和子线程的区别
总结:
-
服务是长期在后台运行的
-
开启一个用真的死循环的子线程也是在后台长期运行
*如果一个应用程序有后台的服务在运行,即使你杀掉进程,进程和服务还会自动的复活
-
如果一个应用程序只有后台的子线程运行 杀掉进程进程和子线程都挂了
-
如果你要保证一个后台的操作长期运行1.开启服务 2.在服务里面创建线程