一、简介

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. 第21篇 ubuntu安装ftp服务器(转载)

    ubuntu安装ftp服务器 1: 安装vsftpd ~$ sudo apt-get install vsftpd ubuntu10.10自己装了,这步省略. 2: 配置vsftpd 2.1 修改vs ...

  2. php小白和菜鸟 上班路上可以看的修行博客

    上班地铁 公交上我们不要去追剧 不要去打游戏 不要看看有效性的海量新闻, 我们需要去技术博客里遨游, 下面就推荐点与php有关的可以学习的技术博客; 大部分程序员在自学的道路上不知道走了多少坑,这个视 ...

  3. 多线程设计模式(二):Future模式

    一.什么是Future模型: 该模型是将异步请求和代理模式联合的模型产物.类似商品订单模型.见下图: 客户端发送一个长时间的请求,服务端不需等待该数据处理完成便立即返回一个伪造的代理数据(相当于商品订 ...

  4. cin cout getline string

    1.C++ code, When we want to read a number whatever the type is int or double , just use cin >> ...

  5. krpano之背景音乐

    步骤: 1.添加音乐控制插件 <!-- START:音乐控制 --> <plugin name="soundinterface" url="%SWFPA ...

  6. VS2010调用halcon的时候出现试图加载格式不正确的程序(this.hWindowControl1 = new HalconDotNet.HWindowControl();)

    [重要错误修改] /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容. /// </summary> private v ...

  7. leetcode812

    class Solution { public: double largestTriangleArea(vector<vector<int>>& points) { d ...

  8. leetcode868

    class Solution { public: int binaryGap(int N) { ; vector<int> V; while (N) { )//N&1==1,表示最 ...

  9. ubuntu&nbsp;12.04修改环境变量PAT…

    这里我只针对ubuntu 12.04进行了测试,由于不同的linux发行版本可能会有一些地方不一致,所以对于其他的linux发行版仅供参考. 1.直接在命令行里添加  我们先来看下下PATH的值 ec ...

  10. POJ1657

    1.题目链接地址 http://poj.org/problem?id=1657 2.源代码 #include<iostream> using namespace std; int main ...