Service使用总结

来源:互联网 发布:电脑培训软件机构咨询 编辑:程序博客网 时间:2024/06/12 01:45

Service使用总结

调用服务中的方法

interface IApp {    void install();    void unInstall();    void update();}public class AppManagerService extends Service {    @Override    public void onCreate() {        super.onCreate();        LogUtils.e("AppManagerService onCreate");    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        LogUtils.e("AppManagerService onBind");        return new AppManagerBinder();    }    private void install() {        LogUtils.e("AppManagerService install");    }    private void unInstall() {        LogUtils.e("AppManagerService unInstall");    }    private void update() {        LogUtils.e("AppManagerService update");    }    @Override    public int onStartCommand(Intent intent, int flags, int startId) {        int command = super.onStartCommand(intent, flags, startId);        LogUtils.e("AppManagerService onStartCommand");        return command;    }    private class AppManagerBinder extends Binder implements IApp {        @Override        public void install() {            LogUtils.e("AppManagerBinder install");            AppManagerService.this.install();        }        @Override        public void unInstall() {            LogUtils.e("AppManagerBinder unInstall");            AppManagerService.this.unInstall();        }        @Override        public void update() {            LogUtils.e("AppManagerBinder update");            AppManagerService.this.update();        }    }}

>

public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private AppServiceConn conn;    private IApp mAppManagerBinder;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        addListener();        initData();    }    private void initData() {        bindLocalService();    }    private void bindLocalService() {        Intent service = new Intent(this, AppManagerService.class);        startService(service);        conn = new AppServiceConn();        bindService(service, conn, Service.BIND_AUTO_CREATE);    }    private void addListener() {        findViewById(R.id.btn_bind_service).setOnClickListener(this);        findViewById(R.id.btn_call_method).setOnClickListener(this);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.btn_bind_service:                Intent service = new Intent(this, AppManagerService.class);                startService(service);                conn = new AppServiceConn();                bindService(service, conn, Service.BIND_AUTO_CREATE);                break;            case R.id.btn_call_method:                if (mAppManagerBinder != null) {                    mAppManagerBinder.install();                    mAppManagerBinder.unInstall();                    mAppManagerBinder.update();                }                break;        }    }    private class AppServiceConn implements ServiceConnection {        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            LogUtils.e("AppServiceConn onServiceConnected");            mAppManagerBinder = (IApp) iBinder;        }        @Override        public void onServiceDisconnected(ComponentName componentName) {            LogUtils.e("AppServiceConn onServiceDisconnected");        }    }}

调用远程服务

server端

  • main/aidl

    interface IPay {    void pay();    void reverse();}
  • main/java/service

    public class PayService extends Service {    @Nullable    @Override    public IBinder onBind(Intent intent) {        return new PayServiceBinder();}private class PayServiceBinder extends IPay.Stub {    @Override    public void pay() throws RemoteException {        LogUtils.e("PayServiceBinder pay");        doPay();    }    @Override    public void reverse() throws RemoteException {        LogUtils.e("PayServiceBinder reverse");        doRerverse();    }}private void doRerverse() {    LogUtils.e("PayService doRerverse");}private void doPay() {    LogUtils.e("PayService doPay");}

    }

  • 清单文件中的配置

    <service android:name=".PayService">    <intent-filter>        <action android:name="com.example.bindserviceaidl.XXXX"/>    </intent-filter></service>

client端

  • 将main/aidl中的aidl目录直接全部复制到客户端的main中

  • 调用如下

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private ClientServiceConn mConn;    private IPay mIBinder;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        addListener();        bindRemoteService();    }    private void addListener() {        findViewById(R.id.tv).setOnClickListener(this);    }    private void bindRemoteService() {        Intent service = new Intent();        service.setAction("com.example.bindserviceaidl.XXXX");        mConn = new ClientServiceConn();        bindService(service, mConn, Service.BIND_AUTO_CREATE);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.tv:                if (mIBinder != null) {                    try {                        mIBinder.pay();                        mIBinder.reverse();                    } catch (RemoteException e) {                        e.printStackTrace();                    }                }                break;        }    }    private class ClientServiceConn implements ServiceConnection {        @Override        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {            LogUtils.e("ClientServiceConn onServiceConnected");            // 这个是远程使用的方式,本地使用可以强制转换            mIBinder = IPay.Stub.asInterface(iBinder);        }        @Override        public void onServiceDisconnected(ComponentName componentName) {            LogUtils.e("ClientServiceConn onServiceDisconnected");        }    }}