一、简介

Service是Android系统的后台服务组件,适用于开发无界面、长时间运行的应用功能
Service特点如下:
没有用户界面
不会轻易被Android系统终止
在系统资源恢复后Service也将自动恢复
运行状态
可用于进程间通信

二、生命周期

创建MyService extends Service

清单文件中注册:

<service android:name=".MyService"/>

两种启动方式:

1.startService(Intent service)

1.调用startService()启动MyService,

  Intent startIntent=new Intent(this,MyService.class);
  startService(startIntent);
2.多次调用startService并不会多次执行MySercice中的onCreate()方法,会多次执行onStartCommand()方法
3.调用stopService()销毁MyService
  Intent stopIntent=new Intent(this,MyService.class);
  stopService(stopIntent);

2.bindService(Intent service, ServiceConnection conn,int flags)

1.调用startService()启动MyService,
Intent startIntent=new Intent(this,MyService.class);
startService(startIntent);
2.多次调用startService并不会多次执行MySercice中的onCreate()方法,会多次执行onStartCommand()方法
3.调用stopService()销毁MyService
Intent stopIntent=new Intent(this,MyService.class);
stopService(stopIntent);

bindService(Intent service, ServiceConnection conn,int flags)
1)在MyService中创建并声明MyBinder ,MyBinder中封装可能会执行的任务
  private MyBinder mBinder=new MyBinder();

  

class MyBinder extends Binder {
public void downLoad(){
Log.e(TAG, "downLoad: " );
new Thread(new Runnable() {
@Override
public void run() {
// 执行具体的下载任务
}
}).start();
} }

2)声明ServiceConnection,并在onServiceConnected中获取MyService.MyBinder

  

 private ServiceConnection connection=new ServiceConnection() {

        //activity和service创建连接时调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(TAG, "onServiceConnected: " );
//这里可以获取myBinder 通过myBinder里的方法 和service交互
myBinder= (MyService.MyBinder) service;
myBinder.downLoad();
}
//unbind()调用时不会调用此方法 不是解除关联的时候调用,而是发生异常时调用的
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e(TAG, "onServiceDisconnected: " ); }
};

3)在MyService的onBind()方法中返回mBinder;

  

@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind: " );
return mBinder;
}

4)调用onBind()绑定Service和Activity,启动MyService

  

Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE);

5)调用 unbindService(connection) 销毁MyService

unbindService(connection);

在activty中拿到mBinder后,就可以进行activity和service之间的交互了。

若一个Service先通过startService启动 再通过bindService启动。单独stopService()或者unbindService()都不能销毁Service,先stopService(),再unBindService()销毁MyService。

6)注意事项

  1.Service是运行在主线程中的,不能直接执行耗时操作。可以在Service中创建一个子线程进行耗时操作

  2.既然要在Service里也创建一个子线程,那为什么不直接在Activity里创建呢?

  这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。

而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,
然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。

  3.标准的Service常用格式:

  

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
new Thread(new Runnable() {
@Override
public void run() {
// 开始执行后台任务
}
}).start();
return super.onStartCommand(intent, flags, startId);
} class MyBinder extends Binder { public void startDownload() {
new Thread(new Runnable() {
@Override
public void run() {
// 执行具体的下载任务
}
}).start();
} }

三、代码

 

  1.MyService

public class MyService extends Service {

    private String TAG="333";
private MyBinder mBinder=new MyBinder();
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "onCreate: " );
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand: " );
new Thread(new Runnable() {
@Override
public void run() {
// 开始执行后台任务
}
}).start();
return super.onStartCommand(intent, flags, startId);
} @Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind: " );
return mBinder;
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: " );
super.onDestroy();
} class MyBinder extends Binder {
public void downLoad(){
Log.e(TAG, "downLoad: " );
new Thread(new Runnable() {
@Override
public void run() {
// 执行具体的下载任务
}
}).start();
} }
}

2.activity

public class MainActivity extends AppCompatActivity {

    private String TAG="333";
private MyService.MyBinder myBinder;
private ServiceConnection connection=new ServiceConnection() { //activity和service创建连接时调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(TAG, "onServiceConnected: " );
//这里可以获取myBinder 通过myBinder里的方法 和service交互
myBinder= (MyService.MyBinder) service;
myBinder.downLoad();
}
//unbind()调用时不会调用此方法 不是解除关联的时候调用,而是发生异常时调用的
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e(TAG, "onServiceDisconnected: " ); }
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View v){
switch (v.getId()){
case R.id.button://startService
Intent startIntent=new Intent(this,MyService.class);
startService(startIntent);
break;
case R.id.button2://stopService
Intent stopIntent=new Intent(this,MyService.class);
stopService(stopIntent);
break;
case R.id.button3:
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, connection, BIND_AUTO_CREATE); break;
case R.id.button4:
unbindService(connection);
break;
}
}
}

参考:

    

   

Android Service基本知识总结(一)的更多相关文章

  1. Android Service基础知识你知道多少?

    Android四大组件-Service 多次调用startService会怎样?会执行多次onCreate吗? StopService在哪里调用?stopSelf在哪调用? 怎样使Service被ki ...

  2. Android Service使用拾遗[阿里工程师分享]

    Service作为android的四大组件之一常用来帮助我们完成一些需要放在后台处理的任务,通过startService和bindService两种方式被调用.因为Service也是在主线程中运行的, ...

  3. Android Service AIDL 远程调用服务 【简单音乐播放实例】

    Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成 ...

  4. android图形基础知识

    Android核心分析(23)-----Andoird GDI之基本原理及其总体框架 2010-06-13 22:49 18223人阅读 评论(18) 收藏 举报 AndroidGDI基本框架 在An ...

  5. Android Service用法知识点的讲解

    Android Service 学习Service相关知识点: android service 的基础知识,生命周期,service分类,运行地点(本地服务,远程服务),运行类型(前台服务,后台服务) ...

  6. android service两种启动方式

    android service的启动方式有以下两种: 1.Context.startService()方式启动,生命周期如下所示,启动时,startService->onCreate()-> ...

  7. 1、Android Studio集成极光推送(Jpush) 报错 java.lang.UnsatisfiedLinkError: cn.jpush.android.service.PushProtoco

    Android studio 集成极光推送(Jpush) (华为手机)报错, E/JPush: [JPushGlobal] Get sdk version fail![获取sdk版本失败!] W/Sy ...

  8. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  9. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...

随机推荐

  1. new JSONObject()报错

    如果缺少下列依赖包会报错: 1.commons-beanutils-1.7.0.jar 2.commons-collections-3.2.1.jar 3.commons-lang-2.3.jar 4 ...

  2. 【转】Jmeter安装 for windows

    总结: 一.Jmeter安装总结 1.配置Java环境变量时需要注意设置的路径需要和JDK安装的路径一样 2.配置Java环境变量时需要注意JDK的版本号 3.配置环境变量时多个变量以分号隔开,但是确 ...

  3. AngularJS:表达式

    ylbtech-AngularJS:表达式 1.返回顶部 1. AngularJS 表达式 AngularJS 使用 表达式 把数据绑定到 HTML. AngularJS 表达式 AngularJS ...

  4. 1111 Online Map

    题意:给定一个图,以及起点和终点,需要我们计算两条路径.第1条路径:距离最短路径,若不唯一,则选择用时最短的那一条:第2条路径:用时最少路径,若不唯一,选择经过结点数最少的那一条. 思路:两次Dijk ...

  5. lnmp一键安装包,安装多版本php,并开启redis与swoole

    安装多版本的php sudo ./install.sh mphp Install ZendGuardLoader for PHP 7.1... unavailable now. Write ZendG ...

  6. 【转】分布式存储和一致性hash

    本文我将对一致性算法作介绍,同时谈谈自己对一致性hash和一般意义上的hash算法的区别 hash是什么 hash即hash算法,又称为散列算法,百度百科的定义是 哈希算法将任意长度的二进制值映射为较 ...

  7. Android 自定义相机Demo源码

    Github源码:https://github.com/LinJZong/AndroidProject.git 模仿360相机,图片资源来源于360相机,仅供学习使用.使用过程中遇到问题或Bug可发我 ...

  8. oracle删除重复数据

    select id from LOG where created >= to_date('2015/2/7 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and cre ...

  9. Java面向对象-代码块

    Java面向对象-代码块 代码块主要就是通过{}花括号 括起来的代码: 主要分为 普通代码块 构造块 静态代码块三类.后面学到线程还有一个同步代码块,到时候再说: 普通代码块:仅仅是花括号括起来的代码 ...

  10. Struts2处理逻辑的方式

    1.可以统一写一个action 对应方法名处理不同逻辑 2.也可以分别写Action 分别处理不同的逻辑