Android之Service通信

一、本地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() {

    }
}

  

  

时间: 2024-08-18 18:38:08

Android之Service通信的相关文章

(六)Android中Service通信

一.启动Service并传递参数 传递参数时只需在startService启动的Intent中传入数据便可,接收参数时可在onStartCommand函数中通过读取第一个参数Intent的内容来实现 1.MainActivity.java package com.example.shiyanshi.serviceconnected; import android.app.Activity;import android.content.Intent;import android.os.Bundle

Android之Service通信-(2)

一.Service通过IBinder与Activity进行通信 在Service中进行下载 Service package chuiyuan.lsj.androidjava.service; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.IBinder; import android.util.Log; import android.wi

【学习笔记】Android中Service通信

一.Service的生命周期(onCreate onStart onDestroy onBind ) 1). 被启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行.如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart

Android中Service通信(一)——启动Service并传递数据

启动Service并传递数据的小实例(通过外界与服务进行通信): 1.activity_main.xml: <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:text="默认信息" android:id="@+id/etData"/> <Button android:text=&

android 远程Service以及AIDL的跨进程通信

在Android中,Service是运行在主线程中的,如果在Service中处理一些耗时的操作,就会导致程序出现ANR. 但如果将本地的Service转换成一个远程的Service,就不会出现这样的问题了. 转换成远程Service非常简单,只需要在注册Service的时候将他的android:process的属性制定成 :remote就可以了. 重新运行项目,你会发现,不会出现ANR了. 为什么将MyService转换成远程Service后就不会导致程序ANR了呢?这是由于,使用了远程Serv

Android中Service与多个Activity通信

由于项目需要,我们有时候需要在service中处理耗时操作,然后将结果发送给activity以更新状态.通常情况下,我们只需要在一个service与一个activity之间通信,通常这种情况下,我们使用最多的是通过回调接口.具体做法是在service中定义一个接口,在activity中实现该接口,并通过bindservice来传入.实现方式很简单,在此不再赘述. 当需要将service中的结果一次发送给多个activity时,我们又该如何实现呢?经过多个项目的积累,总结了三种实现的方式.分别是回

Android通过Service调用远程接口—AIDL-进程间通信

在Andorid平台中,各个组件运行在自己的进程中,他们之间是不能相互访问的,但是在程序之间是不可避免的要传递一些对象,在进程之间相互通信.为了实现进程之间的相互通信,Andorid采用了一种轻量级的实现方式RPC(Remote Procedure Call 远程进程调用)来完成进程之间的通信,并且Android通过接口定义语言(Andorid Interface Definition Language ,AIDL)来生成两个进程之间相互访问的代码,例如,你在Activity里的代码需要访问Se

Android Web Service学习总结(一)

最近学习android平台调用webWebService,学习了一篇不错的博客(http://blog.csdn.net/lyq8479/article/details/6428288),可惜是2011年时的方法,而不适合现在android4.0之后的android版本,所以通过一番学习和研究,总结如下. web Service简介 通俗的理解:通过使用WebService,我们能够像调用本地方法一样去调用远程服务器上的方法.我们并不需要关心远程的那个方法是Java写的,还是PHP或C#写的:我

Android中远程Service浅析

上一篇文章中简单的写了一下关于Android中Service的两种启动方式,不过都是本地的服务,今天就简单的写下关于Android中远程Service的使用,学习之前先了解两个概念,AIDL( Android Interface definition language)字面上的意思就是借口定义语言,专业一点理解就是Android进程之间通信的借口描述语言.IPC(Inter-Process Conmmunication)内部进程之间的通信,同一个手机上,如果你的APP需要访问调用另外一个APP的