`

Android 后台服务

阅读更多
后台服务:运行在后台,一般没有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
    ...


}





项目源码:








  • rpc.zip (101 KB)
  • 下载次数: 125
分享到:
评论
2 楼 zhoujiamail 2011-12-06  
非常感谢,学习了
1 楼 778856 2010-05-02  
学习ing

相关推荐

Global site tag (gtag.js) - Google Analytics