一、创建Service

  1.创建一个myService类,来继承Service。重写其中的方法,包括:onCreate(),onStartCommend(),onDestroy(),onBind()方法是自动重载的。

    1.1 onCreate():创建Service的时候调用,只调用一次。

    1.2 onStartCommend():执行Service的时候调用,执行几次,调用几次。

    1.3 onDestroy():在销毁Service的时候调用,只调用一次。

    1.4 onBind():在bindService的时候调用。只调用一次。

  1.2 myService代码如下:

package com.wangpei.service;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log; /**
* 作者:WangPei on 2015/7/9 09:48
* 邮箱:460977141@qq.com
*/
public class myService extends Service { private static final String TAG = "myInfo";
  //需要返回Binder实例
private MyBinder myBinder = new MyBinder(); @Override
public IBinder onBind(Intent intent) {
return myBinder;
} @Override
public void onCreate() {
Log.i(TAG,"onCreate is excute");
super.onCreate();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"onStartCommand is excute");
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
Log.i(TAG,"onDestroy is excute");
super.onDestroy();
} class MyBinder extends Binder{ public void startDownload(){
        //模拟下载任务
Log.i(TAG,"startDownload is excute");
}
}
}

二、startService AND stopService

  2.1 startService

    2.1.1 代码如下:

Intent startIntent = new Intent(MainActivity.this,myService.class);
startService(startIntent);

    2.1.2 调用myService类中的方法顺序如下:

        onCreate() ---> onStartCommend() ---先创建Service,然后在执行。

  2.2 stopService 代码如下:

    2.2.1 代码如下:

Intent stopIntent = new Intent(MainActivity.this,myService.class);
stopService(stopIntent);

    2.2.2 调用myService类中的方法顺序如下:

        onDestroy() --直接被销毁。

三、bindService AND unBindService

  3.1 创建ServiceConnection:

//初始化myService中的binder
private myService.MyBinder myBinder; private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (myService.MyBinder) service;
       //启动下载任务
myBinder.startDownload();
} @Override
public void onServiceDisconnected(ComponentName name) { }
};

    3.1.1 onServiceConnected()方法,是在Activity和Service建立连接的时候,进行调用。

    3.1.1 onServiceDisconnected()方法,onServiceDisconnected()方法不是解除关联的时候调用,而是发生异常时调用的。

  3.2 bindService 代码如下:

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

    3.2.1 BIND_AUTO_CREATE:意思是在绑定Service的时候,进行自动创建。

  3.3 unBindService 代码如下:

unbindService(connection);

  3.4 注意 如果同时startService和bindService,必须要stopService和unBindService,才能onDestroy()该Service。

   3.5 额外的东西

    楼主文中是有说明Service和Activity是如何通信的;首先在自定义的Service类中覆盖onBind(Intent intent)方法,返回一个Binder子类的对象,在自定义的Binder子类中可以定义一些方法;然后再Activity创建个ServiceConnection对象,并实现其onServiceConnected(ComponentName name, IBinder service) 方法,在这个方法中将传入的IBinder对象强转为在Service中定义的Binder子类,这样就拿到了Service中的某个对象的引用了,想怎通信都行;但要使onServiceConnected方法被回调,还需要调用bindService方法,把ServiceConnection的对象当作参数传过去......

四、Service AND Thread 的关系

  4.1 Service

    4.1.1 Service旨在后台运行,并且Service也是在主线程中运行的。

    4.1.2 Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。

    4.1.3 使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。

    4.1.4 我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。

    4.1.5 较为标准的Service写法:

private MyBinder myBinder;

@Override  
public Binder onBind(Intent intent){
  return myBinder;
}
@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();
} }

  4.2 Thread

    4.2.1 Thread是在子线程中运行的,旨在不影响主线程的运行。

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

五、前台Service

  5.1 需要在通知栏显示,点击之后,可以跳转到Activity。优点,可以保持持续的运行。比如说墨迹天气,它的Service在后台更新天气数据的同时,还会在系统状态栏一直显示当前天气的信息。具体实现如下:

public class MyService extends Service {  

    public static final String TAG = "MyService";  

    private MyBinder mBinder = new MyBinder();  

    @Override
public void onCreate() {
super.onCreate();
    //先定义通知
Notification notification = new Notification(R.drawable.ic_launcher,
"有通知到来", System.currentTimeMillis());
    //跳转意图
Intent notificationIntent = new Intent(this, MainActivity.class);
    //将意图转换为等待意图
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
    //初始化通知
notification.setLatestEventInfo(this, "这是通知的标题", "这是通知的内容",
pendingIntent);
    //然后调用startForeground()方法就可以让MyService变成一个前台Service,并会将通知的图片显示出来。
startForeground(1, notification);
Log.d(TAG, "onCreate() executed");
} ......... }

 六、远程Service

  6.1 远程Service介绍:

        在注册service的时候,添加属性:remote即可激活远程service。远程service,是不同有主进程的service。直接可以在内部执行耗时操作,并且不影响主进程的使用。但是,有一个弊端。远程service没有办法和Activity进行绑定。因为,远程service是不同于应用程序主进程的进程,他们之间无法建立连接的。

     那么如何,才能使Activity和远程service建立连接呢?这里我们需要使用AIDL。接口定义语言来实现跨进程通信技术。

  6.2 AIDL(android interface definition language)的使用:

    6.2.1 使用方法,先建立一个后缀为AIDL的文件,这是一个接口文件。然后进行编译。系统会自动生成一个java文件。然后我们就可以进行使用了。

// IMyAidlInterface.aidl
package com.wangpei.service; // Declare any non-default types here with import statements interface IMyAidlInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
*/
int plus(int a, int b);
String toUpperCase(String str);
}

   6.2.2 然后进行编译,系统会自动生成一个相应的java文件。此时,我们就可以使用它了。

在MyService中进行使用(对aidl中的方法,进行重写。):

package com.wangpei.service;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log; /**
* 作者:WangPei on 2015/7/9 09:48
* 邮箱:460977141@qq.com
*/
public class myService extends Service { private static final String TAG = "myInfo";
private MyBinder myBinder = new MyBinder(); @Override
public IBinder onBind(Intent intent) {
return mBinder;
} IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {
@Override
public int plus(int a, int b) throws RemoteException {
return a+b;
} @Override
public String toUpperCase(String str) throws RemoteException {
if(str != null){ return str.toUpperCase();
}else {
return null;
}
}
}; @Override
public void onCreate() {
Log.i(TAG,"onCreate is excute");
// Log.i(TAG,"myService thread is :"+Thread.currentThread().getName()); /**
* 前台Service的使用
*/
// Notification notification = new Notification(R.drawable.ic_launcher,"这是通知的内容",System.currentTimeMillis());
// Intent notificationIntent = new Intent(this,MainActivity.class);
// PendingIntent pendingIntent = PendingIntent.getActivity(this,0,notificationIntent,0);
// notification.setLatestEventInfo(this,"这是通知的标题","这是主要内容",pendingIntent);
// startForeground(1,notification); super.onCreate();
} @Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i(TAG,"onStartCommand is excute");
return super.onStartCommand(intent, flags, startId);
} @Override
public void onDestroy() {
Log.i(TAG,"onDestroy is excute");
super.onDestroy();
} class MyBinder extends Binder{ public void startDownload(){
Log.i(TAG,"startDownload is excute");
}
}
}

  6.2.3 最后在Activity中进行调用,即可,使用Aidl中,所定义的方法。

 private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// myBinder = (myService.MyBinder) service;
// myBinder.startDownload();
iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
try {
int result = iMyAidlInterface.plus(9,15);
String str = iMyAidlInterface.toUpperCase("wang pei"); Log.i(TAG,result+"");
Log.i(TAG,str);
} catch (RemoteException e) {
e.printStackTrace();
}
}

  

    

  

【笔记】Service的使用的更多相关文章

  1. Android 学习笔记 Service服务与远程通信...(AIDL)

    PS:这一章节看的我有几分迷茫,不是很容易理解...不过还好总算是明白了一大半了...基本的迷惑是解决了... 学习内容: 1.跨应用启动服务... 2.跨应用绑定服务... 3.跨应用实现通信... ...

  2. Android 学习笔记 Service

    PS:前几篇的内容光是上代码了,也没有细细的讲解..感觉这样写很不好..因此还是多一些讲解吧... 学习内容: 1.了解Service... 2.Service的启动与停止.. 3.绑定与取消绑定Se ...

  3. android学习笔记 Service

    Service(服务): 长期后台运行的没有界面的组件 android应用什么地方需要用到服务? 天气预报:后台的连接服务器的逻辑,每隔一段时间获取最新的天气信息.股票显示:后台的连接服务器的逻辑,每 ...

  4. Angular 学习笔记——service &constant

    <!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...

  5. 安卓组件service

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

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

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

  7. 时隔两年最近再次折腾opensuse 的一些笔记 - opensuse linux java service shell

    时隔两年最近再次折腾opensuse 的一些笔记 - opensuse linux java service shell opensuse 一些常用命令:    service xxx start/s ...

  8. Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能

    前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...

  9. Dynamic CRM 2013学习笔记(二十九)报表设计:reporting service 报表开发常见问题

    在报表开发过程中,经常会遇到各种各样的问题,比如The report cannot be displayed. (rsProcessingAborted),一点有意义的提示都没有:再就是分页问题,经常 ...

  10. 安卓第十三天笔记-服务(Service)

    安卓第十三天笔记-服务(Service) Servcie服务 1.服务概念 服务 windows 服务没有界面,一直运行在后台, 运行在独立的一个进程里面 android 服务没有界面,一直运行在后台 ...

随机推荐

  1. H5 学习笔记(一、关于position定位)

    主要是relative与absolute的用法: 1.relative 依据left right top bottom 等属性在正常文档流中脱离位置,即相对于他的正常文档流位置进行移动.两个都为rel ...

  2. 微信webview

    会露出灰色的地步 https://segmentfault.com/q/1010000004295291 有说用iscroll5来解决,但是明显有bug啊 https://segmentfault.c ...

  3. 关于meta元信息元素

    HTML头部<meta>标记通过属性定义文件的名称.内容.关键词.作者.描述等多种信息,但是只能在源代码中显示,页面上无法显示出来.此标签可以在头部有多个. A.设置页面关键词 基本语法: ...

  4. 初始JavaScript

    本文是笔者在看廖雪峰老师的JavaScript教程时的总结 一.加载 JavaScript           1.直接在html语句中写入JavaScript语句           2.在html ...

  5. Nodejs express中创建ejs项目,解决express下默认创建jade,无法创建ejs问题

    最近在看<Node.js开发指南>,看到使用nodejs进行web开发的时候,准备创建ejs项目遇到问题了, 书上命令为: express -t ejs microblog 可是执行后,仍 ...

  6. 20169212《Linux内核原理与分析》第十一周作业

    缓冲区溢出漏洞实验 缓冲区溢出漏洞:缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器 ...

  7. python【1】-基础知识

    1.简介 python是一种解释性的.面向对象的.带有动态语义的高级程序设计语言. 廖雪峰网站:http://www.liaoxuefeng.com/wiki/001374738125095c955c ...

  8. Python:循环语句

    while 在某种条件下,执行某段程序 >>> w=0 >>> while w<5: ... print 'w :',w ... w=w+1 ... w : ...

  9. 简化通过classname查找 方法

    function getClass(oParent,sclass){ var aEle=oParent.getElementsByTagName('*'); var result=[]; for(va ...

  10. js变量及其作用域

    Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量   一.js变量的类型及 ...