Service与Activity通信

1、因为一个服务可以startService多次(每次都会调用onStartCommand),所以可以利用Intent传值。

  • intent.putExtra("data",text.getText().toString());
    startService(intent);

  • public int onStartCommand(Intent intent, int flags, int startId) {
    data = intent.getStringExtra("data");
    return super.onStartCommand(intent, flags, startId);
    }

2、利用返回来的binder,对service数据进行操作。

  •   Service代码
    public class Myservice extends Service {
    
        private boolean doing = true;
        private String data="default";
        
        @Override
        public IBinder onBind(Intent intent) {
            return new MyBinder();
        }
        
        @Override
        public void onCreate() {
            
            doing = true;
            new Thread(){
                    @Override
                    public void run() {
                        while (doing) {
                            Log.v("service",data);
                            try {
                                sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    };
            }.start();
            super.onCreate();
        }
        
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            data = intent.getStringExtra("data");
            return super.onStartCommand(intent, flags, startId);
        }
        
        @Override
        public void onDestroy() {
            doing = false;
            Log.v("service","服务停止");
            super.onDestroy();
        }
        
        public class MyBinder extends android.os.Binder{
            public void Setdate(String data) {
                Myservice.this.data = data;
            }
        }
    }

     

  • 获取binder :

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
    binder = (MyBinder) service;
    Log.v("service","绑定成功");
    }

3、通过回调(Service的开启的线程调用)和线程间发消息(hander)来实现对Service的监听。

  • 注意:辅助线程是不能够操作ui线程的资源的。这是android的一种保护机制。
  • MainActivity代码:
  • package com.example.connectservice;
    
    import com.example.connectservice.Myservice.MyBinder;
    
    import android.app.Activity;
    import android.app.Service;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.opengl.ETC1;
    import android.os.Binder;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.IBinder;
    import android.os.Message;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.EditText;
    import android.widget.TextView;
    
    
    public class MainActivity extends Activity implements OnClickListener, ServiceConnection {
    
        
        EditText text ;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            text = (EditText)findViewById(R.id.et);
            
            findViewById(R.id.btStartService).setOnClickListener(this);
            findViewById(R.id.btStopService).setOnClickListener(this);
            findViewById(R.id.btnBind).setOnClickListener(this);
            findViewById(R.id.btnUnBind).setOnClickListener(this);
            findViewById(R.id.btnSycnData).setOnClickListener(this);
        }
    
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            // Handle action bar item clicks here. The action bar will
            // automatically handle clicks on the Home/Up button, so long
            // as you specify a parent activity in AndroidManifest.xml.
            int id = item.getItemId();
            if (id == R.id.action_settings) {
                return true;
            }
            return super.onOptionsItemSelected(item);
        }
    
    
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(MainActivity.this,Myservice.class);
            switch (v.getId()) {
            case R.id.btStartService:
                intent.putExtra("data",text.getText().toString());
                startService(intent);
                break;
                
            case R.id.btStopService:
                stopService(intent);
                break;
            case R.id.btnBind:
                bindService(new Intent(this, Myservice.class), this,Context.BIND_AUTO_CREATE);
                break;
                
            case R.id.btnUnBind:
                unbindService(this);
                break;        
            case R.id.btnSycnData:
                if (binder != null) {
                    binder.Setdate(text.getText().toString());
                }
                break;
            }
        }
    
        public Myservice.MyBinder binder;
        private Handler handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                ((TextView)findViewById(R.id.tv)).setText(msg.getData().getString("data"));
            }
        };
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            binder = (MyBinder) service;
            binder.SetCallBack(new Myservice.CallBack() {
                
                @Override
                public void onDataChange(String data) {
                    Message msgMessage = new Message();
                    Bundle bundle = new Bundle();
                    bundle.putString("data", data);
                    msgMessage.setData(bundle);
                    handler.sendMessage(msgMessage);
                }
            });
            Log.v("service","绑定成功");
        }
    
    
        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
        
    }

     

  • Myservice代码:
  • package com.example.connectservice;
    
    import android.R.integer;
    import android.R.string;
    import android.app.Application;
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    import android.util.Log;
    
    public class Myservice extends Service {
    
        private boolean doing = true;
        private String data="default";
        
        @Override
        public IBinder onBind(Intent intent) {
            return new MyBinder();
        }
        
        @Override
        public void onCreate() {
            doing = true;
            new Thread(){
                int i =0;
                @Override
                public void run() {
                    while (doing) {
                        Log.v("service",data);
                        String string = i+":"+data;
                        i++;
                        if (callBack!=null) {
                            callBack.onDataChange(string);
                        }
                        try {
                            sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
            }.start();
            super.onCreate();
        }
        
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            data = intent.getStringExtra("data");
            return super.onStartCommand(intent, flags, startId);
        }
        
        @Override
        public void onDestroy() {
            doing = false;
            Log.v("service","服务停止");
            super.onDestroy();
        }
        
        
        
        private CallBack callBack = null;
        
        
        public class MyBinder extends android.os.Binder{
            public void Setdate(String data) {
                Myservice.this.data = data;
            }
            public void SetCallBack(CallBack callBack) {
                Myservice.this.callBack = callBack;
            }
        }
        
        public interface CallBack{
            public void onDataChange(String data);
        }
    }

     

posted @ 2015-05-14 17:07  何人之名  阅读(144)  评论(0)    收藏  举报