Service的另一种启动方式bandservice:
Sercice中的有个重写的方法是onBind();
但是onBind()方法需要返回一个IBinder所以需要一个类实现IBinder接口但是重写IBinder必须非常多的方法但这许多方法是无用的所以通常用一个类继承IBinder的实现类Binder这样就有了返回值。
2.在Activity中启动bindService但是bindService需要的参数
(Intent service, ServiceConnection conn, int flags)
可以看到这三个参数类型只有第二个我们没办法传递,于是我们又需要一个类继承ServiceConnection
之后展示一个小demo更便于理解
XML文件只需要两个按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.bawei.mybindservice.MainActivity">
<Button
android:id="@+id/btn"
android:onClick="onClick"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击找到狗" />
<Button
android:id="@+id/jiechu"
android:onClick="unbind"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点击解除" />
</LinearLayout>*
这里是我的Service类
package com.bawei.mybindservice;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
import android.widget.Toast;
public class MyDogService extends Service {
public MyDogService() {
}
@Override
public IBinder onBind(Intent intent) {
Log.e("tag", "onBind() ");
// TODO: Return the communication channel to the service.
return new Mybind();
}
//之前说的继承Ibinder的实现类
class Mybind extends Binder{
public void mybinda(){
Dog();
}
}
public void Dog(){
Toast.makeText(this,"找到了狗",Toast.LENGTH_SHORT).show();
}
@Override
//解除Service绑定
public boolean onUnbind(Intent intent) {
Log.e("tag", "onUnbind()");
return super.onUnbind(intent);
}
}
我的Activity类
package com.bawei.mybindservice;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private Myconn mconn;
private Boolean flag=true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onClick(View v){
if(flag){
Myconn mconn=new Myconn();
flag=false;
Intent intent=new Intent(this,MyDogService.class);
bindService(intent,mconn,BIND_AUTO_CREATE);
}else {
Toast.makeText(this,"建立了链接",Toast.LENGTH_SHORT).show();
}
}
//这里是继承的那个启动Bindsrvice的参数
class Myconn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyDogService.Mybind mybind= (MyDogService.Mybind) iBinder;
mybind.mybinda();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
}
public void unbind(View v){
if(mconn!=null){
unbindService(mconn);
mconn=null;
flag=true;
}else{
Toast.makeText(this,"请先绑定",Toast.LENGTH_SHORT).show();
}
}
}