package com.example.binbin.testbinder;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Toast; /**
* Created by binbin on 2016/7/29.
*/
public class MyService extends Service { //自定义的binder,包含了我们所需的操作
class myBinder extends Binder{ //要在Service进行的操作
public void sayHello(){ Log.d("TAG","sayHello");
Toast.makeText(MyService.this,"Hello",Toast.LENGTH_SHORT).show(); } public void sayBye(){ Log.d("TAG","sayBye");
Toast.makeText(MyService.this,"Bye",Toast.LENGTH_SHORT).show(); } }; @Nullable
@Override
//绑定服务和进行通信的时候,一定要返回一个自定义的Binder
public IBinder onBind(Intent intent) {
Log.d("TAG","onBind");
return new myBinder();
} @Override
public void onCreate() {
super.onCreate();
Log.d("TAG","onCreate");
} @Override
public int onStartCommand(Intent intent, int flags, int startId) { Log.d("TAG","onStartCommand");
return super.onStartCommand(intent, flags, startId); } @Override
public void onDestroy() {
super.onDestroy();
Log.d("TAG","onDestroy"); } @Override
public boolean onUnbind(Intent intent) { Log.d("TAG","onUnbind");
return super.onUnbind(intent);
}
}

自定义了myBinder,在Activity与Service绑定的时候,返回myBinder的实例,Activity就可以操作Service里面的方法了(sayHello和sayBye)。

Activity里面必须要有两个实例,一个是myBinder,用于与Service通信的。另一个是ServiceConnection,代表了activity与服务的连接,在后面绑定的时候要传入这个类的实例,只有两个方法,我们要重写。第一个是连接成功时要干什么,肯定是要把binder返回给activity里面的binder啦。

public class MainActivity extends AppCompatActivity {

    //四个按钮
Button start, stop, bind, unbind,sayHello,sayBye; //自定义的Binder对象
private MyService.myBinder binder; //绑定服务要添加的对象,ServiceConnection代表与服务的连接,系统自己会调用,我们只需要实现,不需要显示调用
//绑定的时候要把这个对象传进去。
private ServiceConnection conn = new ServiceConnection() { //连接成功
@Override
public void onServiceConnected(ComponentName name, IBinder service) { Log.d("TAG","Connect!");
binder = (MyService.myBinder) service; //获取其实例
//binder.sayHello(); //调用其方法
} //连接失败
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); start = (Button) findViewById(R.id.Start);
stop = (Button) findViewById(R.id.Stop);
bind = (Button) findViewById(R.id.Bind);
unbind = (Button) findViewById(R.id.unBind);
sayHello = (Button) findViewById(R.id.hello);
sayBye = (Button) findViewById(R.id.bye); start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent); }
}); stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { Intent intent = new Intent(MainActivity.this, MyService.class);
stopService(intent); }
}); bind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { Intent intent = new Intent(MainActivity.this,MyService.class);
//传进去了conn对象
bindService(intent,conn,BIND_AUTO_CREATE); }
}); unbind.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { //解除只需要传入连接对象
unbindService(conn); }
}); sayHello.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { binder.sayHello(); }
}); sayBye.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) { binder.sayBye(); }
}); // ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}

开启和绑定服务之后,按Hello,就可以使用服务里面的sayHello方法了。

activity与service进程内通信的更多相关文章

  1. MXNet源码分析 | KVStore进程内通信

    本文主要基于MXNet1.6.0版本进行分析. MXNet的KVStore模块下有几个比较重要的类.KVStore是一个抽象类,提供了一些通用的API,例如Init.Push和Pull等.因为KVSo ...

  2. activity 与 service 之间的通信

    activity和service通信:通过binder 举个我实际项目中的例子:在service中下载更新应用 首先是下载更新apk的service: public class UpdateVersi ...

  3. 通过messenger实现activity与service的相互通信

    布局: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to ...

  4. 201709012工作日记--activity与service的通信机制

    service生命周期 Service主要包含本地类和远程类. Service不是Thread,Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 ...

  5. Android中Activity、Service和线程之间的通信

    Activity.Service和线程应该是Android编程中最常见的几种类了,几乎大多数应用程序都会涉及到这几个类的编程,自然而然的,也就会涉及到三者之间的相互通信,本文就试图简单地介绍一下这三者 ...

  6. activity与service之间的通信方式

    Activity之间的通信 1.activity与activity的通信可以通过Intent来封装数据,startActivityForResult()来实现,当跳转的activity调用finish ...

  7. Activity与Service通信(不同进程之间)

    使用Messenger 上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger. 其实实现IPC(Inter-Process Communicat ...

  8. Activity和Service是否是在同一个进程中运行。

    一般情况下,Activity和Service在同一个包名内,并且没有设定属性android:process=":remote",两者在同一个进程中. 因为一个进程只有一个UI线程, ...

  9. Activity与Service通信的方式有三种:

    在博客园看到的,看着挺不错的,借来分享下 继承Binder类 这个方式仅仅有当你的Acitivity和Service处于同一个Application和进程时,才干够用,比方你后台有一个播放背景音乐的S ...

随机推荐

  1. 用xapian来做索引

    最近一个项目需要正则搜索MongoDB,400多万的数据一次查询要20s以上,需要建立一个前端索引服务.本着部署简单.开发容易的原则,找到了xapian这个索引库. 我使用的是Python的接口,xa ...

  2. 内联汇编实现 memcpy 和 memset

    #pragma check_stack( off) LPVOID __cdecl _memcpy(void * dst, void* src, size_t size) { int dwSize = ...

  3. java运行jar命令提示没有主清单属性和找不到主类

    推荐一个java运行jar命令提示没有主清单属性的百度经验的链接:https://jingyan.baidu.com/article/db55b60990f6084ba30a2fb8.html jav ...

  4. BZOJ1017: [JSOI2008]魔兽地图DotR【树形DP】【玄学】

    Description DotR (Defense of the Robots) Allstars是一个风靡全球的魔兽地图,他的规则简单与同样流行的地图DotA (Defense of the Anc ...

  5. 在iOS上实现二维码功能

    http://blog.csdn.net/abcmx/article/details/8011904 如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.而手机等移动设备又成为二维码的 ...

  6. Quartz 2D编程指南(4) - 颜色和颜色空间

    不同的设备(显示器.打印机.扫描仪.摄像头)处理颜色的方式是不同的.每种设备都有其所能支持的颜色值范围.一种设备能支持的颜色可能在其它设备中无法支持.为了有效的使用颜色及理解Quartz 2D中用于颜 ...

  7. python调用dll

    调用CALLBACK标记的dll方法要用dll = ctypes.windll.LoadLibrary( 'test.dll' ) 没有CALLBACK的方法用dll = ctypes.cdll.Lo ...

  8. java基础--关键字

  9. openresty 几个插件使用

    1. jwt    opm get SkyLothar/lua-resty-jwt   2. cookie   opm get p0pr0ck5/lua-resty-cookie   3. http ...

  10. 模态对话框中的window.close关闭时会打开新页面

    在模态对话框的页面的<head></head>加上<base target="_self"> 就不会打开新页面了.