android-Service-<十一>

1.Service

它是android的四大组件之一,也需要在xml里注册。它可以长时间运行于后台,但是没有用户界面。

即使用户切换不同应用程序,它还可以保持它的运作。比如后台开音乐播放等。

常用于耗时较长的操作,如更新ContentProvider,发送Intent以及启动系统的通知等等

注意:Service不是一个单独的进程,或线程。

2.Service调用形式(可以同时采取两者形式)

Started:  调用Activity的startService方法启动。它独立操作,可以调用stopService方法销毁它。

坏处,无法Activity无法获取Service里信息。

Bound:  调用bindService方法。它绑定了调用它的Activity,采用client-server形式与 Activity交流。

主要是通过一个IBinder对象实现,多个组件可以同时绑定同一个Service,这时Service相当

于服务器,其他的组件(即使在其他应用程序)都可以发信息给Service与它联系,直到所有的

组件解除绑定,它才死亡。

注意:不管你的调用形式是怎样,其他组件(甚至是在其他应用里的)可以使用该Service,不过你可以在xml里私有化Service,

让其他组件无法访问。Service不是一个线程或进程,它是在主线程中运行的,除非你另开一个线程给Service,让它专注它的事情。

3.绑定

a.Activity类

通过intent指定对应的Service类,调用bindService(intent, sc, BIND_AUTO_CREATE)方法

绑定该Service,sc为ServiceConnection类,

b.ServiceConnection类

onServiceConnected(ComponentName name, IBinder service)方法:与Service绑定时调用

在与Service绑定时,接受Service发过来的binder。         onServiceDisconnected(ComponentName name) 方法:解除绑定时调用

在与Service解除绑定时,处理相应情况

c.Service(抽象类)

onCreate()方法: //创建该对象时调用,该对象一直运行直到销毁!

onDestroy()方法://销毁时调用,如stopService

onStartCommand方法://启动Service时调用,如startService

IBinder onBind(Intent intent)方法(必须覆盖重写):

该方法是用于,当用户bindservice绑定该Service时调用,并返回该IBinder主要是

通过IBinder对象进行通信交流,帮助文档说最好继承Binder(类)的一个类来返回。

4.Demo

两个Button,”完成绑定”:实现bindService操作。”获取服务信息”:获取返回IBinder里的信息

Activity类

package hq.bindService;

import hq.bindService.FirstService.CIBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class BindServiceActivity extends Activity {
    /** Called when the activity is first created. */
    private Button b=null;
    private Button b2=null;
    private CIBinder cb=null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        b=(Button)findViewById(R.id.b);
        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                 //绑定Service,任何的联系通过intent意图实现,所以立刻创建intent
                Intent intent=new Intent();
                //马上显示指定启动哪个Service
                intent.setClass(BindServiceActivity.this, FirstService.class);
                //第二个参数为ServiceConnection,这里用来处理
                //在与Service绑定时,接受Service发过来的binder。
                //在与Service解除绑定时,处理相应情况
                bindService(intent, sc, BIND_AUTO_CREATE);
            }
        });
        b2=(Button)findViewById(R.id.b2);
        b2.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // 通过binder获取它的Service
                FirstService s=cb.getService();
                //调用绑定Service的成员方法
                System.out.println("cb-get-service-mes"+s.getServiceMess());
            }
        });

    }
  //写一个实现ServiceConnection接口的对象。
    ServiceConnection sc=new ServiceConnection(){
       //当bindService时调用,即与Service建立联系时,接受发过来的IBinder
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            System.out.println("onServiceConnected:name="+name);
            cb=(CIBinder)service;
            String s=cb.getExtra();
            System.out.println("onServiceConnected:"+s);
        }
       //解除绑定时调用
        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            System.out.println("onServiceDisconnected:name="+name);
        }
     };
}

继承Service的子类

 1 package hq.bindService;
 2 import java.io.FileDescriptor;
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.Binder;
 6 import android.os.IBinder;
 7 import android.os.IInterface;
 8 import android.os.Parcel;
 9 import android.os.RemoteException;
10
11 public class FirstService extends Service
12 {
13     private final CIBinder cb=new CIBinder();
14     //该方法是用于,当用户bindservice绑定该Service时调用,并返回该IBinder
15     //主要是通过IBinder对象进行通信交流
16     @Override
17     public IBinder onBind(Intent intent) {
18         // TODO Auto-generated method stub
19         //帮助文档说最好继承Binder(类)
20         return cb;
21     }
22     //创建一个IBinder
23     class  CIBinder extends Binder
24     {
25         public FirstService getService()
26         {
27             return FirstService.this;
28         }
29         public String  getExtra()
30         {
31             return "cbinder:getextra";
32         }
33
34     }
35     public String getServiceMess()
36     {
37         return "getServiceMess";
38     }
39
40 }

时间: 2024-10-28 20:48:44

android-Service-<十一>的相关文章

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

转自:http://blog.csdn.net/guolin_blog/article/details/9797169 转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在 上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法.Service和Activity进行通信.Service的销毁方式. Service与Thread的关系.以及如何创建前台Service.以上

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

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色.它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持

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

转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要内容,包括Service的基本用法.Service和Activity进行通信.Service的销毁方式.Service与Thread的关系.以及如何创建前台Service.以上所提到的这些知识点,基本上涵盖了大部分日常开发工作当中可能使用到的Service技术.不过关于Service其实还有一个更加

Android Service演义

摘要: 本文基于Android 5.1代码,介绍了Android Service的运作机理.按理说,网上此类文章已经很多了,本不需我再赘述.但每个人理解技术的方式多少会有所不同,我多写一篇自己理解的service,也未尝不可吧. (本文以Android 5.1为准) 侯亮 1.概述 在Android平台上,那种持续性工作一般都是由service来执行的.不少初学者总是搞不清service和线程.进程之间的关系,这当然会影响到他们开展具体的开发工作. 其实,简单说起来,service和线程.进程是

浅谈 Android Service

 浅谈Android Service的基本用法: 关于Service最基本的用法自然是启动和停止操作. 启动Service有两种方式: 1.通过startService(Intent intent)方式启动,启动时会自动执行onCreate(),onStartCommand()方法. 2.通过bindService(Intent intent,ServiceConnection connection,int flag) 第一个参数是一个Intent对象,第二个参数是连接Service的实例,

Android -- Service绑定解绑和aidl

Service是安卓四大组件之一,先前讲到了Service的生命周期,以及非绑定类型的生命周期的例子,这次来分享一下绑定形式的. 应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder. 绑定是异步的,bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给b

Android Service组件在新进程绑定(bindService)过程

1.首先看两个例子 (1)进程内 Client端 public class CounterService extends Service implements ICounterService { ...... public class CounterBinder extends Binder { public CounterService getService() { return CounterService.this; } } ...... } Server端 public class Ma

Android Service(上)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的Android程序员如果连Service都没听说过的话,那确实也太逊了.Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色.它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候我们甚至可以在程序退出的情况下,让Service在后台继续保持

Android Service组件在进程内绑定(bindService)过程

本文参考Android应用程序绑定服务(bindService)的过程源代码分析http://blog.csdn.net/luoshengyang/article/details/6745181和<Android系统源代码情景分析>,作者罗升阳 一.Android Service组件在进程内绑定(bindService)过程 0.总图流程图如下: 1.Counter和CounterService所在应用程序主线程向ActivityManagerService进程发送BIND_SERVICE_T

Android:Service的非绑定式的创建和生命周期

Android的Service若使用非绑定式的创建,则创建后将无法再与它取得联系,即无法传递消息参数等: 所以如果希望创建后仍然与其存在联系,那么可以参考我的前几篇博客<Android:Service的绑定和解绑定,Service与Activity通信>,其中讲到了Service的绑定和与Activity通信的相关内容(如题目o(^▽^)o). Service的非绑定式的创建非常的简单,和启动Activity差不多. 只需要调用startService()即可创建:而调用stopSercice