activity与service进程内通信

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方法了。

时间: 2024-08-26 15:46:17

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

Android 子Activity组件在进程内的启动过程 && 子Activity组件在新进程中的启动过程

1.子Activity组件在进程内的启动过程 在Android Activity组件的启动过程http://blog.csdn.net/jltxgcy/article/details/35984557一文中,我们已经详细分析了Activity的启动过程,对于子Activity组件在进程内的启动过程,我们只分析它们之间的不同. 主要是2处,1是不需要创建新的任务栈,2是不需要创建新进程和子线程. 第1点,体现在如下代码上: -/Android/frameworks/base/services/ja

android基础部分再学习---再谈Service进程服务通信

Bound Services 快速查看 bound服务允许被其它控件绑定,以便与之交互并进行进程间通信 一旦所有的客户端都解除了绑定,bound服务将被销毁.除非该服务同时又是started类型的. 在本文中(参见目录) 关键类 Service ServiceConnection IBinder 范例 RemoteService LocalService bound服务是客户端-服务器模式的服务.bound服务允许组件(比如activity)对其进行绑定.发送请求.接收响应.甚至进行进程间通信(

activity 与 service 之间的通信

activity和service通信:通过binder 举个我实际项目中的例子:在service中下载更新应用 首先是下载更新apk的service: public class UpdateVersionService extends Service { private final String tag = "young"; private Context context = this; private BaseApplication application; private Down

Android基础笔记(十一)- Service基础和注意事项以及Activity与Service的通信

Service的基本概念 为什么要有Service Service的基本用法 电话窃听器的小案例 Service和Activity通信 Service和Thread的关系 向光明而行! Service的基本概念 Service是Android的四大组件之一,在每一个应用程序中都扮演者非常重要的角色. 它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候,我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态. 既然都是被用于处理耗时的操作,那么我们什么

使用Messenger进行Activity与Service之间的相互通信

在Android开发中,有时候我们需要让一个Activity绑定一个Service,进行两者之间的通信.当Activity绑定成功以后,就可以调用Service中的public(或有对应可见级别)的方法.如果Service想把一些信息反馈给Activity,则需要将Activity的Listener传递给Service,由Service负责调用. 这样的做法是可以实现功能的,但有一些缺憾. 首先,Service需要把被调用的方法做成public的,不利于隐藏实现. 第二,调用显得凌乱,在Acti

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

使用Messenger 上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger. 其实实现IPC(Inter-Process Communication,进程间通信)的方式,还有AIDL,但推荐使用Messenger,有两点好处: 1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多 2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的.如果你的

Android Service组件在进程内绑定(bindService)过程

本文参考Android应用程序绑定服务(bindService)的过程源代码分析http://blog.csdn.net/luoshengyang/article/details/6745181和<Android系统源代码情景分析>,作者罗升阳 一.Android Service组件在进程内绑定(bindService)过程 0.总图流程图如下: 1.Counter和CounterService所在应用程序主线程向ActivityManagerService进程发送BIND_SERVICE_T

Android Bound Service(一) ----- Extending Binder Service(进程内绑定Service的简单例子)

ref:http://developer.android.com/guide/components/bound-services.html? 前言 重新学习这一项技术,主要的原因,是因为以前没有好好的学,那时总觉得作品能动,能完成工作就好了,而这种得过且过的想法,大大地影响了我的技术程度,也因此,在这个这个博客里,有许多的复习心得.有幸得到一位前辈的指导,指出,若只是学习,而无实际应用,这样进步会较少,因此,最好要多看源码,并且自己多尝试多实践,这样学习一万小时,应该能有小进步,因此开始了 Bo

DroidPlugin源码分析插件进程管理以及预注册Activity,Service,ContentProvide的选择

在360对DroidPlugin的特点介绍中有云: 插件的四大组件完全不需要在Host程序中注册,支持Service.Activity.BroadcastReceiver.ContentProvider四大组件. 实现了进程管理,插件的空进程会被及时回收,占用内存低. 之所以支持Service,Activity,ContentProvider三大组件,是因为DroidPlugin在AndroidManifest文件中预先注册了8个运行插件的进程,每个进程预注册Service一个, Content