|
|
后台服务:运行在后台,一般没有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 ...}
项目源码: |
|