Activity与Service之间的通信(组件之间的通信)

1、Activity 绑定Service形式 2、使用BroadcastReceiver通信 3、定义interface进行回调 4、使用EventBus通信: EventBus是一个事件订阅/发布模型,用以简化Android内部组件之间的数据通信。
Android Studio中使用EventBus: gradle:
compile 'de.greenrobot:eventbus:2.4.0'


主要涉及函数:

1)注册eventbus:

EventBus.getDefault().register(this);

2)注销eventbus:

EventBus.getDefault().unregister(this);
3)定义事件Event

public class ServiceToActivityEvent

4)定义事件响应onEvent:

// 响应Service发送来的Eventpublic void onEventMainThread(ServiceToActivityEvent event) {    String msg = event.getMsg();    mytxt.setText(msg);}
onEventMainThread是四种订阅函数的一种,

响应事件共有如下四种:

onEvent:如果使用onEvent作为订阅函数,那么该事件在哪个线程发布出来的,onEvent就会在这个线程中运行,也就是说发布事件和接收事件线程在同一个线程。使用这个方法时,在onEvent方法中不能执行耗时操作,如果执行耗时操作容易导致事件分发延迟。
onEventMainThread:如果使用onEventMainThread作为订阅函数,那么不论事件是在哪个线程中发布出来的,onEventMainThread都会在UI线程中执行,接收事件就会在UI线程中运行,这个在Android中是非常有用的,因为在Android中只能在UI线程中跟新UI,所以在onEvnetMainThread方法中是不能执行耗时操作的。
onEventBackground:如果使用onEventBackgrond作为订阅函数,那么如果事件是在UI线程中发布出来的,那么onEventBackground就会在子线程中运行,如果事件本来就是子线程中发布出来的,那么onEventBackground函数直接在该子线程中执行。
onEventAsync:使用这个函数作为订阅函数,那么无论事件在哪个线程发布,都会创建新的子线程在执行onEventAsync.

5)发送消息事件:

EventBus.getDefault().post(new ServiceToActivityEvent("MyEvent Send!"));

具体应用:

1)两个用以保存事件具体内容的自定义类:

public class ActivityToServiceEvent {    private String msg_text;    public ActivityToServiceEvent(String msg_text) {        this.msg_text = msg_text;    }    public String getMsg() {        return msg_text;    }}

public class ServiceToActivityEvent {    private String msg_text;    public ServiceToActivityEvent(String msg_text) {        this.msg_text = msg_text;    }    public String getMsg() {        return msg_text;    }}

2)Activity:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{    private MyView myView;    private TextView mytxt;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 注册EventBus        EventBus.getDefault().register(this);        initView();    }    private void initView() {        mytxt = (TextView) findViewById(R.id.mytxt);        mytxt.setOnClickListener(this);        Intent intent = new Intent(MainActivity.this, MyService.class);        startService(intent);    }    // 响应Service发送来的Event    public void onEventMainThread(ServiceToActivityEvent event) {        String msg = event.getMsg();        mytxt.setText(msg);    }    @Override    protected void onDestroy(){        super.onDestroy();        // 注销EventBus        EventBus.getDefault().unregister(this);    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.mytxt:                EventBus.getDefault().post(new ActivityToServiceEvent("mytxt_OnClick"));                break;        }    }}

3)Service:

public class MyService extends Service {    @Override    public void onCreate() {        super.onCreate();        EventBus.getDefault().register(this);        new Thread(new Runnable() {            @Override            public void run() {                try {                    Thread.sleep(5000);                    EventBus.getDefault().post(new ServiceToActivityEvent("MyEvent Send!"));                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }).start();    }    @Override    public void onDestroy() {        super.onDestroy();        EventBus.getDefault().unregister(this);    }    @Nullable    @Override    public IBinder onBind(Intent intent) {        return null;    }    public void onEventMainThread(ActivityToServiceEvent event) {        String msg = event.getMsg();        Toast.makeText(this, msg, Toast.LENGTH_LONG).show();    }}


更多相关文章

  1. Android(安卓)FrameWork——Binder机制详解
  2. Android(安卓)开发艺术探索笔记(十三) 之 Window 和 WindowManager
  3. Android(安卓)Camera2 Hal3(一)初始化
  4. Android(安卓)定位的实现
  5. android之recyclerview的基本使用
  6. Android(安卓)3.0 r1 API中文文档(113) ――SlidingDrawer
  7. Android事件分发机制------------>验证+理解
  8. Android(安卓)Monkey测试及源码分析
  9. Android(安卓)开源框架选择

随机推荐

  1. Android一直震动源码
  2. android的Timer方法
  3. Android studio RelativeLayout相对布局(
  4. android Digital Clock
  5. android ion 内存泄漏排查
  6. android获取屏幕相关信息
  7. android首页Splash页面简单实现
  8. Android 判断程序前后台状态
  9. Android Path的使用
  10. Android传感器(一)-列出手机所具有的传感器