应用程序与Service之间通信

来源:互联网 发布:知天下图片 编辑:程序博客网 时间:2024/06/06 23:58

实现与Service通信有两种方法,第一种使用bindService()来启动Service

第二种就是使用startService()启动Service,但是使用BroadCast广播作为信使,

public class BindService extends Service{    private int count;    private boolean quit;    // 定义onBinder方法所返回的对象    private MyBinder binder = new MyBinder();    // 通过继承Binder来实现IBinder类    public class MyBinder extends Binder    {        public int getCount()        {            // 获取Service的运行状态:count            return count;        }    }    // 必须实现的方法    @Override    public IBinder onBind(Intent intent)    {        System.out.println("Service is Binded");        // 返回IBinder对象        return binder;    }    // Service被创建时回调该方法。    @Override    public void onCreate()    {        super.onCreate();        System.out.println("Service is Created");        // 启动一条线程、动态地修改count状态值        new Thread()        {            @Override            public void run()            {                while (!quit)                {                    try                    {                        Thread.sleep(1000);                    }                    catch (InterruptedException e)                    {                    }                    count++;                }            }        }.start();          }    // Service被断开连接时回调该方法    @Override    public boolean onUnbind(Intent intent)    {        System.out.println("Service is Unbinded");        return true;    }    // Service被关闭之前回调。    @Override    public void onDestroy()    {        super.onDestroy();        this.quit = true;        System.out.println("Service is Destroyed");    }        @Override    public void onRebind(Intent intent)     {        super.onRebind(intent);        this.quit = true;        System.out.println("Service is ReBinded");    }   }


首先我们写一个BindService类,其中,必须重写IBinder onBind()方法,该方法返回一个Binder对象,(但是要注意,Binder为抽象类,需要定义一个内部类实现Binder对象),该对象将作为参数传给bindService(Intent intetn,ServiceConnection conn,int flags)方法的第二个参数,然后,在MainActivity中调用bindService()方法,这样应用程序与Service就形成了通信。

public class MainActivity extends Activity{    Button bind , unbind , getServiceStatus;    // 保持所启动的Service的IBinder对象    BindService.MyBinder binder;    // 定义一个ServiceConnection对象    private ServiceConnection conn = new ServiceConnection()    {        // 当该Activity与Service连接成功时回调该方法        @Override        public void onServiceConnected(ComponentName name            , IBinder service)        {            System.out.println("--Service Connected--");            // 获取Service的onBind方法所返回的MyBinder对象            binder = (BindService.MyBinder) service;        }        // 当该Activity与Service断开连接时回调该方法        @Override        public void onServiceDisconnected(ComponentName name)        {            System.out.println("--Service Disconnected--");                 }    };    @Override    public void onCreate(Bundle savedInstanceState)    {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        // 获取程序界面中的start、stop、getServiceStatus按钮        bind = (Button) findViewById(R.id.bind);        unbind = (Button) findViewById(R.id.unbind);        getServiceStatus = (Button) findViewById(R.id.getServiceStatus);        //创建启动Service的Intent        final Intent intent = new Intent();        //为Intent设置Action属性        intent.setAction("org.crazyit.service.BIND_SERVICE");               bind.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View source)            {                //绑定指定Serivce                bindService(intent , conn , Service.BIND_AUTO_CREATE);              }        });        unbind.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View source)            {                //解除绑定Serivce                unbindService(conn);            }        });         getServiceStatus.setOnClickListener(new OnClickListener()        {            @Override            public void onClick(View source)            {                // 获取、并显示Service的count值                Toast.makeText(MainActivity.this                    , "Serivce的count值为:" + binder.getCount()                    , 4000)                    .show();            }        });    }}


运行程序


当点击“ 绑定Service”按钮时,在logcat中,我们可以看到“Service is connected”,同时我们可以看到Service的生命周期当点击“ 绑定Service”按钮时,在logcat中,我们可以看到“Service is connected”,同时我们可以看到Service的生命周期


原创粉丝点击