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 }
View Code

 5.Parcel

    序列化,按照一定的顺序存储数据。能够放入IBinder里

    构造方法: Parcel p=Parcel.obtain();

    添加数据的方法: p.writeXxxx();//用指针的方式指向最后添加的数据(即指针一个一个往后移)

    取数据的步骤:1.将指针置0,指向第一个数据:p.setDataPosition(0)。2.开始取数据:p.readXxxx();//注意:xxx与放入的类型匹配。

6.Binder(IBinder的子类)

   成员方法:onTransact(int code, Parcel data, Parcel reply, int flags);//在Service端实现覆盖,

                 transact(int code, Parcel data, Parcel reply, int flags);//在Activity端调用该方法,发信息(parcel)给service

               注意:service与activity交流的方式是client-server的形式,一旦在activity端的Binder调用transcact方法。

                        则service端的Binder自动调用onTransact方法。data为activity发送的数据,reply为service回应数据。

                        两个方法的执行,是同时进行的,即一发送data,则立即受到reply。

 

posted @ 2015-02-17 09:27  beyondbycyx  阅读(137)  评论(0编辑  收藏  举报