1.Service简单概述  

Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响。 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC)。 例如,服务可以处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序交互,而所有这一切均可在后台进行:

Service基本上分为两种形式

启动状态 

 当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务, 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。

绑定状态  

应用组件通过调用 bindService() 绑定到服务时,服务即处于“绑定”状态。绑定服务提供了一个客户端-服务器接口,允许组件与服务进行交互、发送请求、获取结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。 仅当与另一个应用组件绑定时,绑定服务才会运行。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

2.在android studio中创建和配置service

1.使用android studio导航创建service

2.选择是否可编译,是否可实例化

需要在manifests进行配置,如果使用导航创建,会自动配置

 <service
android:name=".service.MyService"
android:enabled="true" //是否可以实例化
android:exported="true"></service> //是否可以被调用

配置参数解释

<service android:enabled=["true" | "false"]
android:exported=["true" | "false"]
android:icon="drawable resource"
android:isolatedProcess=["true" | "false"]
android:label="string resource"
android:name="string"
android:permission="string"
android:process="string" >
. . .
</service>
  • android:exported:代表是否能被其他应用隐式调用,其默认值是由service中有无intent-filter决定的,如果有intent-filter,默认值为true,否则为false。为false的情况下,即使有intent-filter匹配,也无法打开,即无法被其他应用隐式调用。
  • android:name:对应Service类名
  • android:permission:是权限声明
  • android:process:是否需要在单独的进程中运行,当设置为android:process=”:remote”时,代表Service在单独的进程中运行。注意“:”很重要,它的意思是指要在当前进程名称前面附加上当前的包名,所以“remote”和”:remote”不是同一个意思,前者的进程名称为:remote,而后者的进程名称为:App-packageName:remote。
  • android:isolatedProcess :设置 true 意味着,服务会在一个特殊的进程下运行,这个进程与系统其他进程分开且没有自己的权限。与其通信的唯一途径是通过服务的API(bind and start)。
  • android:enabled:是否可以被系统实例化,默认为 true因为父标签 也有 enable 属性,所以必须两个都为默认值 true 的情况下服务才会被激活,否则不会激活。

3.Service类方法介绍

public class MyService extends Service {
public MyService() {
} /*
* 绑定服务时才会调用
* 必须要实现的方法
*/
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
} /*
* 首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind() 之前)。
* 如果服务已在运行,则不会调用此方法。该方法只被调用一次
* */
@Override
public void onCreate() {
super.onCreate();
} /*
* 每次通过startService()方法启动Service时都会被回调。
* */
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId); }
/*
* 服务销毁时的回调
* */
@Override
public void onDestroy() {
super.onDestroy();
}
}
  • onBind:当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,必须返回 一个IBinder 接口的实现类,供客户端用来与服务进行通信。无论是启动状态还是绑定状态,此方法必须重写,但在启动状态的情况下直接返回 null。
  •  oncreate:首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或onBind() 之前)。如果服务已在运行,则不会调用此方法,该方法只调用一次
  • onstartCommand::当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果自己实现此方法,则需要在服务工作完成后,通过调用 stopSelf() 或 stopService() 来停止服务。(在绑定状态下,无需实现此方法。)
  • onDestroy:当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等,这是服务接收的最后一个调用。

4.startService开启音乐播放器的例子

public class MusicService extends Service {
public static boolean isPlay; //记录当前播放状态
private static MediaPlayer player; //记录MediaPlay对象
public MusicService() {
} @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
} @Override
public void onCreate() {
//创建的时候把资源文件放进去
player= MediaPlayer.create(this, R.raw.music);
super.onCreate();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
//判断是否在部分,如果没有就开启播放,然后把播放状态存起来
if(!player.isPlaying()){
player.start();
isPlay = player.isPlaying();
}
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
//销毁的时候停止播放,释放资源
player.stop();
isPlay = player.isPlaying();
player.release();//释放资源
super.onDestroy();
}

5.bound Service  绑定service实现数据交互

例子:

public class BindService extends Service {
private MyBinder binder = new MyBinder();
public BindService() {
} @Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
//throw new UnsupportedOperationException("Not yet implemented");
return binder; //放回MyBinder对象,实现数据
} @Override
public void onCreate() {
super.onCreate();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
//生成随机数
public List getRandomNum(){
List resArr = new ArrayList();
String strNum;//用于保存随机数
for(int i = ;i<;i++){
int num = new Random().nextInt()+;
if(num<){
strNum = ""+String.valueOf(num);
}else {
strNum = String.valueOf(num);
}
resArr.add(strNum);
}
return resArr;
} //获取bindService
public class MyBinder extends Binder {
public BindService getService(){ //创建获取service的方法
return BindService.this; //放回当前的Service类
} } @Override
public void onDestroy() {//销毁service
super.onDestroy();
}
}

在Activity中实现绑定的代码

 mBtn_getNum
public class ServiceActivity extends BaseActivity implements View.OnClickListener {

    private Button mBtn_start; //开启服务
private Button mBtn_stop; //停止服务
private Button mBtn_play; //播放音乐
private Button mBtn_getNum; //随机选号
private Button mBtn_intent; //intentservice
private Button mBtn_pt; //普通耗时报错 private BindService bindService; @Override
protected int getLayoutId() {
return R.layout.activity_service;
} @Override
protected void initView() {
mBtn_start = findViewById(R.id.btn_start);
mBtn_stop = findViewById(R.id.btn_stop);
mBtn_start.setOnClickListener(this);
mBtn_stop.setOnClickListener(this); mBtn_play = findViewById(R.id.btn_play);
mBtn_play.setOnClickListener(this);
mBtn_getNum = findViewById(R.id.btn_getNum);
mBtn_getNum.setOnClickListener(this); mBtn_intent = findViewById(R.id.btn_play);
mBtn_intent.setOnClickListener(this);
mBtn_pt = findViewById(R.id.btn_getNum);
mBtn_pt.setOnClickListener(this);
} @Override
public void onClick(View v) {
Intent intent = new Intent(ServiceActivity.this,MyService.class);
Intent intent2 = new Intent(ServiceActivity.this,MusicService.class);
switch (v.getId()){
case R.id.btn_start:
startService(intent);
break;
case R.id.btn_stop:
stopService(intent);
break;
case R.id.btn_play:
if(MusicService.isPlay==false){
startService(intent2);
}else{
stopService(intent2);
}
break;
case R.id.btn_getNum:
int[] textId = {R.id.num_1,R.id.num_2,R.id.num_3,R.id.num_4,R.id.num_5,R.id.num_6,R.id.num_7};
List num = bindService.getRandomNum();
for(int i=;i<num.size();i++){
TextView tv = findViewById(textId[i]);
tv.setText(num.get(i).toString()); }
break;
case R.id.btn_pt:
Intent intent3 = new Intent(ServiceActivity.this,PtService.class);
startService(intent3);
break;
case R.id.btn_intent:
break;
default:
break;
}
} @Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this,BindService.class);
bindService(intent,con, Service.BIND_AUTO_CREATE);
} @Override
protected void onStop() {
super.onStop();
unbindService(con);
} //创建一个服务器关联对象
private ServiceConnection con = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
bindService = ((BindService.MyBinder)service).getService();
} @Override
public void onServiceDisconnected(ComponentName name) { }
};
}

6.Intent Service

对比普通Service:

普通Service不能自动开启线程,自动停止线程        ===》使用场景:进行耗时任务,如果不开启新线程时间超过20s就会出现应用无响应的错误,耗时任务完成,不会自动停止线程需要selfstop实现停止服务

IntentService:可以自动开启线程,自动停止线程   ===》使用场景:进行耗时任务,自动开启线程,耗时任务完成,自动停止线程停止服务

android service服务的学习的更多相关文章

  1. Android Service 服务(三)—— bindService与remoteService

    (转自:http://blog.csdn.net/ithomer/article/details/7366396)   一.bindService简介 bindService是绑定Service服务, ...

  2. Android Service 服务

    一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟Activi ...

  3. Android Service 服务(一)—— Service .

    http://blog.csdn.net/ithomer/article/details/7364024 一. Service简介 Service是android 系统中的四大组件之一(Activit ...

  4. [Android] Service服务详解以及如何使service服务不被杀死

    排版上的细节有些不好看,主要是我用的MarkDown编辑器预览和这里的不一样,在那个上面的样式很舒服.这里要改的地方太多就不想改了,将就看吧.下次写的时候注意.还有看到错误给我提啊. 本文链接:htt ...

  5. Android Service 服务(二)—— BroadcastReceiver

    (转自:http://blog.csdn.net/ithomer/article/details/7365147) 一. BroadcastReceiver简介 BroadcastReceiver,用 ...

  6. android Service服务(二)

    1.1 活动和服务进行通信 上一节中我们学习了启动和停止服务的方法.不知道你又没有发现,虽然服务是在活动里启动的,但在启动了服务之后,活动和服务基本上就没关系了,确实如此,我们在活动里调用了start ...

  7. android Service服务简介(一)

    作为android的四大组件之一,服务也少不了很多重要的知识点.下面我们从最基本的开始学习. 1.1服务的创建 首先创建一个ServiceTest类继承Service.我们会重写onCreate(), ...

  8. Android Service服务

    Service是Android系统中提供的四大组件之一.它是运行在后台的一种服务,一般声明周期较长,不直接与用户进行交互.    服务不能自己运行,需要通过调用Context.startService ...

  9. Android service 服务的应用之电话监听器以及短信监听器

    首先建立一个项目工程文件,如下图所示:

随机推荐

  1. OSX - libc++究竟是啥?

    libc++是什么?  libc++是C++标准库的实现! libc++ is an implementation of the C++ standard library, targeting C++ ...

  2. Navicat 12破解工具 +安装包

    下载地址: https://www.lanzous.com/b657322/ 密码:1j9x zip解压密码:gubin 下载完成 是这样的  先安装第一个  安装完成后 不要打开 ,把第二个复制到安 ...

  3. VC API常用函数简单例子大全(1-89)

    第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCST ...

  4. JVM之JIT

    JIT技术是JVM中最重要的核心模块之一.我的课程里本来没有计划这一篇,但因为不断有朋友问起,Java到底是怎么运行的?既然Hotspot是C++写的,那Java是不是可以说运行在C++之上呢?为了澄 ...

  5. 二,mysql优化——sql优化基本概念

    1,SQL优化的一般步骤 (1)通过show status命令了解各种SQL执行效率. (2)通过执行效率较低的SQL语句(重点select). (3)通过explain分析低效率的SQL语句的执行情 ...

  6. Android逆向-Android基础逆向(5)

    本文作者:i春秋作家——HAI_ 0×00 前言 不知所以然,请看 Android逆向-Android基础逆向(1)Android逆向-Android基础逆向(2)Android逆向-Android基 ...

  7. java API连接虚拟机上的hbase

    今天用本地的eclipse连接虚拟机上的hbase数据库,代码如下: public static void main(String[] args) throws Exception{ Configur ...

  8. WebDriverAPI(10)

    操作Frame页面元素 测试网址代码 frameset.html: <html> <head> <title>frameset页面</title> &l ...

  9. POJ 2248

    #include <iostream> #define MAXN 100 #define min __min using namespace std; int tem[MAXN]; int ...

  10. 用asp.net core 2.0 + EFCore.Sqlite做个小网站

    许久没用C#写程序.听说进来发生大事,.NetCore2.0发布了,于是便学习了下,本站也应运而生. 大多数的地方按照官方的文档起步走就可以了,这里谈谈遇到的几个坑. 首先,本站是基于ASP.NetC ...