一、简介

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. unidac使用演示

    unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...

  2. 「自己开发直播」rtmp-nginx-module实现直播状态、观看人数控制

    这是自己搭建直播服务器.开发直播平台系列的文章,前面两篇文章分别为: 通过Nginx-rtmp-module搭建直播服务器并实现直播 实现nginx-rtmp-module多频道输入输出与权限控制 这 ...

  3. PHP命名空间带来的干扰

    有时候,不想受命名空间约束,就可以整一个全局类. protected function sendDayuSms($tel,$code,$template_type,$product = "[ ...

  4. Java中静态变量、静态代码块、非静态代码块以及静态方法的加载顺序

    在研究单例设计模式的时候,用到了静态变量和静态方法的内容,出于兴趣,这里简单了解一下这四个模块在类初始化的时候的加载顺序. 经过研究发现,它们的加载顺序为: 1.非静态代码块 2.静态变量或者静态代码 ...

  5. python开发mysql:mysql数据类型&约束条件

    一 整形 只有Int类型跟存储没有关系,显示的是宽度,其他类型都是限制 整形类型:[(m)][unsigned][zerofill] 作用:存储年龄,等级,id,各种号码 m,代表显示宽度 默认11 ...

  6. Py修行路 内置模块补充 datetime模块

      Python提供了多个内置模块用于操作日期时间,像calendar,time,datetime.datetime模块用于是date和time模块的合集,他内部重新封装了time模块,相比于time ...

  7. JS中有几种数据类型分别是哪几种

    number,string,boolean,null,undefined,object

  8. EXT.net 窗体传值

    ext.net 窗体传值 EXT.net 窗体传值 子窗体代码 protected void btnClose_Click(object sender,EventArges e) { PageCont ...

  9. Lyx/LaTeX笔记04---插入伪代码

    1 可用的宏包 常用的排版伪代码包有clrscode, algorithm, algorithmic, algorithmicx, algorithm2e 2 clrscode clrscode是著名 ...

  10. java5 CyclicBarrier同步工具

    CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(common barrier point).在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此 ...