Service初步识别(三)

来源:互联网 发布:快盘关闭数据如何找回 编辑:程序博客网 时间:2024/06/05 19:25

从这个课程链接中学习总结的下文
为什么bindService那么容易被杀死还会存在,直接全用startService多好
bindService可以在service和activity中互相调用方法。
并且开始service的方法必须用同样的方法才能关闭服务。
所以一般都是用startSerice启动,使用bindService绑定服务


这里写图片描述


先上代码

定义一个service

        <service            android:name=".MyService2"            android:enabled="true"            android:exported="true">        </service>

service中的方法

public class MyService2 extends Service {    public static String TAG="MyService";    private SecondActivity secondActivity;    public class MyBinder extends Binder {        //返回service方法的对象        public MyService2 getService(){            return MyService2.this;        }        //通过参数将mainActivity的参数传递给service        public  void setActivity(SecondActivity secondActivity){            MyService2.this.secondActivity=secondActivity;        }    }    public MyService2() {    }    @Override    public void onCreate() {        Log.i(TAG,"onCreate");        Toast.makeText(getApplicationContext(),"onCreate",Toast.LENGTH_SHORT).show();        super.onCreate();    }    @Override    public IBinder onBind(Intent intent) {        Log.i(TAG,"onBind");//        启动一个延时线程,来调用SecondActivity中的方法        new Thread(){            @Override            public void run() {                try {                    Thread.sleep(2000);                    if(secondActivity!=null){                        secondActivity.doSomethingInActivity();                    }                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }.start();        return new MyBinder();    }    @Override    public boolean onUnbind(Intent intent) {        Log.i(TAG,"onUnbind");        Toast.makeText(getApplicationContext(),"onUnbind",Toast.LENGTH_SHORT).show();        return super.onUnbind(intent);    }    @Override    public void onDestroy() {        Log.i(TAG,"onDestroy");        Toast.makeText(getApplicationContext(),"onDestroy",Toast.LENGTH_SHORT).show();        super.onDestroy();    }    public void doSomethingInService(){        Log.i(TAG,"doSomethingInService");    }}

acticity中的方法

public class SecondActivity extends AppCompatActivity {    private Button bt1,bt2,bt3;    public static String TAG="MyService";    private MyService2.MyBinder mMyBinder;    private MyService2 mMyService2;    //成员变量    private ServiceConnection conn=new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            //第二个参数就是onBind方法反会的是MyBinder对象            mMyBinder=(MyService2.MyBinder)service;            //获得service的对象            mMyService2=mMyBinder.getService();            mMyBinder.setActivity(SecondActivity.this);        }        //  被系统回收才会调用        @Override        public void onServiceDisconnected(ComponentName name) {        //把绑定的参数都制空            unbind();        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        initView();        initClick();    }    private void initClick() {        //绑定Service        bt1.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent  intent=new Intent(SecondActivity.this,MyService2.class);                bindService(intent,conn,Service.BIND_AUTO_CREATE);            }        });        //接触绑定Service        bt2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                unbindService(conn);            }        });        //通过bindService启动Service,调用service中的方法        bt3.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if(mMyService2!=null){                    mMyService2.doSomethingInService();                }            }        });    }    private void initView() {        bt1=(Button)findViewById(R.id.bt1);        bt2=(Button)findViewById(R.id.bt2);        bt3=(Button)findViewById(R.id.bt3);    }    private  void unbind(){        conn=null;        mMyService2=null;        mMyBinder=null;    }    public void doSomethingInActivity(){        Log.i(TAG,"doSomethingInActivity");    }}

Activity中调用service的
这里写图片描述
在service中创建方法,方便调用

 public void doSomethingInService(){        Log.i(TAG,"doSomethingInService");    }

创建MyBinder继承Binder

 public class MyBinder extends Binder {        //返回service方法的对象        public MyService2 getService(){            return MyService2.this;        }    }

onBind中返回MyBinder对象

  @Override    public IBinder onBind(Intent intent) {        Log.i(TAG,"onBind");//        启动一个延时线程,来调用SecondActivity中的方法        new Thread(){            @Override            public void run() {                try {                    Thread.sleep(2000);                    if(secondActivity!=null){                        secondActivity.doSomethingInActivity();                    }                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }.start();        return new MyBinder();    }

在Activity中创建ServiceConnection

private MyService2.MyBinder mMyBinder;    private MyService2 mMyService2;
//成员变量    private ServiceConnection conn=new ServiceConnection() {        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            //第二个参数就是onBind方法反会的是MyBinder对象            mMyBinder=(MyService2.MyBinder)service;            //获得service的对象            mMyService2=mMyBinder.getService(); }        //  被系统回收才会调用        @Override        public void onServiceDisconnected(ComponentName name) {        //把绑定的参数都制空            unbind();        }    };
//通过bindService启动Service,调用service中的方法        bt3.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if(mMyService2!=null){                    mMyService2.doSomethingInService();                }            }        });

在service中调用activity中的方法

在MyBinder方法中,通过参数将SecondActivity的参数传递给service

 public  void setActivity(SecondActivity secondActivity){            MyService2.this.secondActivity=secondActivity;        }

在ServiceConnection 的onServiceConnected

 //service获得activity对象    mMyBinder.setActivity(SecondActivity.this);

在IBinder 的onBind方法中启动线程执行SecondActivity中的方法

  @Override    public IBinder onBind(Intent intent) {        Log.i(TAG,"onBind");//        启动一个延时线程,来调用SecondActivity中的方法        new Thread(){            @Override            public void run() {                try {                    Thread.sleep(2000);                    if(secondActivity!=null){                        secondActivity.doSomethingInActivity();                    }                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }.start();        return new MyBinder();    }

效果展示这里写图片描述