码迷,mamicode.com
首页 > 移动开发 > 详细

Android之Service通信

时间:2015-09-05 00:08:20      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:

一、本地Service通信

LocalService 

/**
 * Created by lsj on 2015/8/29.
 * 这是一个LocalService
 */
public class StrReplaceService extends Service {
    private final String TAG="StrReplaceService" ;

    public class MyBinder extends Binder{
        public StrReplaceService getService(){
            return StrReplaceService.this ;
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "onCreate");
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG, "onBind");
        return  new MyBinder() ;
    }


    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG, "onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onDestroy() {
        Log.d(TAG, "onDestroy");
        super.onDestroy();
    }

    public String strReplace (){
        String result = StringReplace.test() ;
        Log.d(TAG,result) ;
        return result ;
    }
}

测试Activity

public class StringReplaceActivity extends BaseActivity {

    private TextView resultTv ;
    private ServiceConnection sc ;
    private StrReplaceService strReplaceService ;
    String result ="string" ;

    @Override
    public void onClick(View v) {

    }

    @Override
    protected void onStart() {
        super.onStart();
        Intent intent = new Intent(this, StrReplaceService.class);
        //onCreate时候已经有了sc
        bindService(intent, sc , Context.BIND_AUTO_CREATE) ;
    }

    @Override
    protected void onStop() {
        super.onStop();
        unbindService(sc);
    }

    @Override
    protected void findView() {
        setContentView(R.layout.activity_str_replace);
    }

    @Override
    protected void initView() {
        resultTv = (TextView)findViewById(R.id.str_replace_resultTv);
        sc = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                strReplaceService = ((StrReplaceService.MyBinder)service).getService() ;
                //这个可以在onClick中调用
                doService();
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {

            }
        };

    }

    /**
     * 调用StrReplaceService中的方法
     */
    private void doService(){
        result = strReplaceService.strReplace() ;
        Log.d(TAG, result) ;
        resultTv.setText(result);
    }

    @Override
    protected void setOnClickListener() {

    }
}  

  

二、跨进程Service通信 

RemoteService 

/**
 * this is remote service
 */
public class CQueueService extends Service {
    private  final String TAG ="CQueueService";

    public static final int MSG_NO = 0;

    class IncomingHandler extends  Handler{
        @Override
        public void handleMessage(Message msg) {
            if (msg.replyTo != null){
                //收到消息后就向客户端发送一个回应
                Message msg_to_client = this.obtainMessage() ;
                msg_to_client.what = CQueueActivity.MSG_NO_TO_CLIENT;
                try {
                    //得到客户端的Messenger,并向它发送消息
                    cMessenger = msg.replyTo ;
                    cMessenger.send(msg_to_client);
                }catch (RemoteException e){

                }
            }
            switch (msg.what){
                case MSG_NO:
                    Toast.makeText(CQueueService.this, "msg from client", Toast.LENGTH_LONG).show();
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }

    /**
     * 自己的Messenger
     */
    Messenger sMessenger= new Messenger(new IncomingHandler());
    //客户端的Messenger
    Messenger cMessenger ;
    public CQueueService() {
    }

    @Override
    public void onCreate() {
        Log.e(TAG, "onCreate");
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.e(TAG, "onBind");
        //返回自己Messenger的binder,以供客户端通过Binder(new Messenger(binder))得到Service的Messenger对象。
        return sMessenger.getBinder();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.e(TAG, "onUnbind");
        return super.onUnbind(intent);
    }
}

在配置文件中

 <!-- remote service -->
        <service
            android:name=".service.CQueueService"
            android:enabled="true"
            android:exported="true"
            android:process=":remote" >
        </service>

测试Activity  

public class CQueueActivity extends BaseActivity{
    public static final int MSG_NO_TO_CLIENT=0;

    ServiceConnection mSc ;

    /**
     * handler of incoming msg from serivce
     */
    class IncomingHandler extends Handler{
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case MSG_NO_TO_CLIENT:
                    Toast.makeText(CQueueActivity.this,"ack_msg from service", Toast.LENGTH_LONG).show();
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    } ;
    /**
     * 自己的Messenger
     */
    Messenger mMessenger = new Messenger(new IncomingHandler()) ;
    //remote Service 的Messenger
    Messenger sMessenger ;

    @Override
    protected void findView() {
        setContentView(R.layout.activity_cqueue);
    }

    @Override
    protected void initView() {
        mSc = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.d(TAG, "onServiceConnected");
                //得到服务端的Messenger
                sMessenger = new Messenger(service);
                //向服务端发送消息
                sendMsg() ;

            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                Log.d(TAG, "onServiceDisconnected");

            }
        } ;
    }

    /**
     * 使用服务端的Messenger向它发送消息
     */
    private void sendMsg(){
        Message msg_to_service = new Message();
        msg_to_service.replyTo =  mMessenger;
        try{
            sMessenger.send(msg_to_service);
        }catch (RemoteException e ){
            e.printStackTrace();
        }
    }


    @Override
    protected void onStop() {
        super.onStop();
        this.unbindService(mSc);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, this.getApplicationContext().getPackageCodePath()) ;
        Intent service  = new Intent(this, CQueueService.class) ;
        this.bindService(service, mSc, Context.BIND_AUTO_CREATE) ;
    }

    @Override
    public void onClick(View v) {

    }

    @Override
    protected void setOnClickListener() {

    }
}

  

  

Android之Service通信

标签:

原文地址:http://www.cnblogs.com/chuiyuan/p/4782553.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!