Android组件--service

一. service与activity通信

1. 同进程下

在service中自定义binder, 在activity中绑定service时得到此binder实例, 通过该实例实现两者间的通信.

public class MainActivity extends Activity { 

    private static final String TAG = "cc"; 
    public MyBinder mBinder; 

    private ServiceConnection mConnection = new ServiceConnection() { 
        @Override 
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) { 
            //在Activity里面取得Service里的binder对象 
            mBinder = (MyBinder)iBinder; 
            //注册自定义回调 
            mBinder.setOnTestListener(new MyBinder.OnTestListener() { 
                @Override 
                public void onTest(String str) { 
                    Log.d(TAG, "receive msg from service: "+str); 
                } 
            }); 
        } 

        @Override 
        public void onServiceDisconnected(ComponentName componentName) { 

        } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        Intent intent = new Intent(MainActivity.this, MyService.class); 
        bindService(intent,mConnection,BIND_AUTO_CREATE); 

        findViewById(R.id.test_bt).setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View view) { 
                //点击按钮调用mBinder里面的方法,发送消息给Service 
                mBinder.testMethod("hi, service."); 
            } 
        }); 
    } 
}


public class MyService extends Service { 
    private static final String TAG = "cc"; 
    // 实例化一个MyBinder对象 
    private MyBinder mBinder = new MyBinder(this); 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
        return mBinder;//返回这个mBinder对象 
    } 

    public void serviceMethod(String str){ 
        Log.d(TAG, "receive msg from activity: " + str); 
    } 
}


public class MyBinder extends Binder { 
    private static final String TAG = "cc"; 
    private MyService mService; 
    private OnTestListener mListener; 

    public MyBinder(MyService service) { 
        this.mService = service; 
    } 

    public void testMethod(String str) { 
        // Activity通过Binder来调用Service的方法将消息传给Service 
        mService.serviceMethod(str); 
        // 并回调mListener.onTest告诉Activity已收到消息 
        mListener.onTest("hi, activity."); 
    } 

    // MyBinder 里面提供一个注册回调的方法 
    public void setOnTestListener(OnTestListener listener) { 
        this.mListener = listener; 
    } 

    //自定义一个回调接口 
    public interface OnTestListener { 
        void onTest(String str); 
    } 
}
2. 跨进程下

使用AIDL跨进程通信, 整体过程和单进程一样, 都是通过一个Binder来通信的, 区别在于单进程的Binder是自己通过继承Binder类来手动实现的, 而跨进程的Binder是通过AIDL自动生成的. 简单来说, AIDL就是一个用来生成代码的工具, 最终的目的就是得到IMyAidlInterface.java这个类.

interface IMyAidlInterface { 
    void testMethod(String str); 
}
public class AidlBinder extends IMyAidlInterface.Stub { 

    private MyService mService; 

    public AidlBinder(MyService service) { 
        this.mService = service; 
    } 

    @Override 
    public void testMethod(String str) throws RemoteException { 
        mService.serviceMethod(str); 
    } 
}
ublic class MyService extends Service { 

    private static final String TAG = "zjy"; 

    private AidlBinder mBinder = new AidlBinder(this); 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
        return mBinder; 
    } 

    public void serviceMethod(String str) { 
        Log.d(TAG, "receive msg from activity: " + str); 
    } 
}
public class MainActivity extends Activity { 

    private static final String TAG = "zjy"; 
    public IMyAidlInterface mService; 

    private ServiceConnection mConnection = new ServiceConnection() { 
        @Override 
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) { 
            mService = IMyAidlInterface.Stub.asInterface(iBinder); 
        } 

        @Override 
        public void onServiceDisconnected(ComponentName componentName) { 

        } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        Intent intent = new Intent(MainActivity.this, MyService.class); 
        bindService(intent, mConnection, BIND_AUTO_CREATE); 

        findViewById(R.id.test_bt).setOnClickListener(new View.OnClickListener() { 
            @Override 
            public void onClick(View view) { 
                try { 
                    mService.testMethod("hi, service."); 
                } catch (RemoteException e) { 
                    e.printStackTrace(); 
                } 
            } 
        }); 
    } 
}
interface IMyCallbackListener { 
    void onRespond(String str); 
}
import com.zjy.servicedemo.IMyCallbackListener; 

interface IMyAidlInterface { 
    void testMethod(String msg); 
    void registerListener(IMyCallbackListener listener); 
}
public class AidlBinder extends IMyAidlInterface.Stub { 

    private MyService mService; 
    private IMyCallbackListener mListener; 

    public AidlBinder(MyService service) { 
        this.mService = service; 
    } 

    @Override 
    public void testMethod(String str) throws RemoteException { 
        mService.serviceMethod(str); 
        mListener.onRespond("hi, activity"); 
    } 

    @Override 
    public void registerListener(IMyCallbackListener listener) throws RemoteException { 
        mListener = listener; 
    } 
}
try{ 
    mService.registerListener(new IMyCallbackListener.Stub() { 
        @Override 
        public void onRespond(String str) throws RemoteException { 
            Log.d(TAG, "receive message from service: "+str); 
        } 
    }); 
} catch (RemoteException e){ 
    e.printStackTrace(); 
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,198评论 6 514
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,334评论 3 398
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,643评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,495评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,502评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,156评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,743评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,659评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,200评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,282评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,424评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,107评论 5 349
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,789评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,264评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,390评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,798评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,435评论 2 359

推荐阅读更多精彩内容