📚 开源资源分享——颜佐光的个人书架
✉️ 联系站长
书架 / Android / 安装

Android后台服务Service

2019-04-14 20:43 · 约 4,104 字 · 浏览 2,702 次 · 更新 2020-05-15 09:43安装语法

基本介绍

  • 桌面应用程序:可见
  • 服务:不可见 长期在后台运行 帮助应用执行耗时的操作
  • 安卓的服务:安卓四大组件之一 不可见 后台长期运行 界面与服务有时候要执行数据交互

如何创建服务:

  1. 创建一个类 继承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表示停止哪一个服务
    }

}

电话窃听器原理

开发步骤:
1. 创建一个后台运行的服务
2. 启动应用的时候启动服务
3. 在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.在服务里面创建线程

← 返回《Android》目录书架 →