六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 35|回复: 0

Android 后台服务

[复制链接]

升级  4.67%

60

主题

60

主题

60

主题

举人

Rank: 3Rank: 3

积分
214
 楼主| 发表于 2013-1-15 02:48:10 | 显示全部楼层 |阅读模式
后台服务:运行在后台,一般没有UI.

1.创建一个简单的服务

a.继承 android.app.Service
b.配置 服务

示例:
public class TestService extends Service{    @override    public void onCreate(){        super.onCreate();        Log.d(TAG, "create testservice...");    }       @override    public IBinder onBind(Intent intent){        Log.d(TAG, "service bind to ...");        return null;    }}AndroidManifest.xml<service name="package-path.TestService"></service>


2.服务接口方法

onCreate():void //只调用一次,生命周期回调
onDestroy():void //服务销毁前调用
onLowMemory():void
onBind(Intent intent):IBinder //提供接口为外部应用服务
onReBind(Intent intent):void
onUnBind(Intent intent):boolean
onStart(Intent intent, int startId):void
stopSelf():void
stopSelf(int startId):void
stopSelfResult(int startId):boolean

setForeground(boolean isForeground):void

onConfigurationChanged(Configuration newConfiguration):void //重新配置服务
getApplication():Application //获取实现服务的应用

3.
一个服务可以是本地服务或远程服务,但不能两种类型都是.
本地服务:通过 Context.startService() 启动.
远程服务:通过 Context.bindService() 启动.

4.
本地服务

5.
远程服务(RPC)
a.使用AIDL定义一个服务
b.继承服务,实现接口
c.配置服务

使用远程服务
a.绑定服务
e.处理响应


AIDL 定义一个服务
IStockQuoteService.aidl
package com.syh;interface IStockQuoteService{    double getQuote(String ticker);}

eclipse adt 自动编译 *.aidl 为 *.java
IStockQuoteService.java
package com.syh;import java.lang.String;import android.os.*;public interface IStockQuoteService extends android.os.IInterface{    public static abstract class Stub extends android.os.Binder implements IStockQuoteService{        private static final String DESCRIPTOR = "com.syh.IStockQuoteService";        public Stub(){            this.attachInterface(this, DESCRIPTOR);        }        ...    }         ....     public double getQuote(String ticker) throws android.os.RemoteException{         ...     }}

实现定义的 AIDL 接口
StockQuoteService.java
package com.syh;import ...public class StockQuoteService extends Service{    private NotificationManager notificationManager = null;    public class StockQuoteServiceImpl extends IStockQuoteService.Stub {        @override        public double getQuote(String ticker){            return 2.0;        }    }     @override     public IBinder onBind(Intent intent){        return new StockQuoteServiceImpl ();    }}

暴露服务:
<service name="com.syh.StockQuoteService">    <intent-filter>        <action name="com.syh.IStockQuoteService" />    </intent-filter></service>

调用服务:
a.创建一个新项目 ServiceClient
b.创建一个新包名 com.syh
c.复制 IIStockQuoteService.aidl 文件到 com.syh 中.
d.调用 Context.bindService();
e.通过 ServiceConnection 的 onServiceConnected 调用远程方法

public class MainActiviy extends Activity{    private IStockQuoteService service = null;    @override    public void onCreate(Bundle savedInstanceState){        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        Button btn = (Button)super.findViewById(R.id.bindBtn);        btn.setOnClickListener(new OnClickListener(){            @override            public void onClick(View view){                this.bindService(new Intent(IStockQuoteService.class.getName(), sc, BIND_AUTO_CREATE));            }        });    }    private ServiceConnection sc = new ServiceConnection(){        @override        public void onServiceConnected(ComponentName cname, IBinder service){            this.service = IStockQuoteService.Stub.asInterface(service);            double val = 0.0;            try{                val = this.service.getQuote("syh");                            }catch(RemoteException e){                Log.e(TAG, e.getMessage(), e);            }        }        @override        public void onServiceDisConnected(ComponentName cname){        }    }; }


6.复杂类型打包
    Parcelable
Persion.java
public class Person extends Object implements Parcelable{    private int age = 0;    private String name = "";    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){        public Person createFormParcel(Parcel in){            return new Person(in);        }        public Person[] newArray(int size){            return new Person[size];        }    };    public Person(){}    private Persion(Parcel in){        readFormParcel(in);    }    @override    public int describeContents(){        return 0;    }    @override    public void writeToParcel(Parcel out, int flags){        out.writeString(name);        out.writeInt(age);    }    @override    public void readFromRarcel(Parcel in){        name = in.readString();        age = in.readInt();    }    //-- getter/setter    ...}




项目源码:
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表