首先介绍一下Service,Service是用来方便我们去管理子线程的,以免子线程变成野线程不方便管理,其中有onCreat、onStartCommand、和onDestory方法
onCreat方法是服务创建是调用,多次启动也之会调用一次
onStartCommand是每一次服务启动都会调用一次,一般的逻辑代码都写在这里
onDestory是在服务销毁是会调用,一般用于回收不再使用的资源
第一种方法是,因为Activity启动Service会利用Intent来启动,所以我们可以利用intent的putExtra方法来把想要使用的参数传入当中,并在Service中重写onStartCommand方法,在方法中利用传过来的intent对象的getStringExtra方法获取传过来的值
贴出关键部分代码:
Activity部分
intent = new Intent(ServiceActivity.this, MyService.class);
intent.putExtra("data", "data");
startService(intent);
Service部分
@Override
public int onStartCommand(final Intent intent, int flags, int startId) {
data = intent.getStringExtra("data");
return super.onStartCommand(intent, flags, startId);
}
第二种方法:创建Service类的时候创建一个binder继承android.os.Binder,在里面写一个你想要传递数据的方法,并且在onBind方法中返回binder的对象。然后在Activity中实现ServiceConnection接口,实现其中的两个方法,在onServiceConnected中利用传入的IBinder对象强制转换为binder类型,然后即可调用你刚才写的方法来传递数据
Service中的关键代码:
@Nullable
@Override
public IBinder onBind(Intent intent) {
return new Binder();
}
public class Binder extends android.os.Binder {
public void setData(String data) {
MyService2.this.data = data;
}
}
Activity中的代码:
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService2.Binder) service;//②
}
if (myBinder != null)
myBinder.setData("启动服务了");
第三种方法,是第一种方法的传递数据过于单一,结合第二种方法的整合版,先在binder类中增加一个获取Service对象的方法,然后在Service类中写一个Callback的回调接口。然后在Activity中的onServiceConnected方法中通过强转的IBinder对象,利用对象中的myBinder.getMyService().setCallback(new MyService3.Callback(){})方法来书写想要实现的内容
Service代码
public class Binder extends android.os.Binder {
public void setData(String data) {
MyService.this.data = data;
}
public MyService getMyService() {
return MyService3.this;
}
}
public void setCallback(Callback callback) {
this.callback = callback;
}
public Callback getCallback() {
return callback;
}
public interface Callback {
void onDataChange(String data);
}
Activity代码
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
myBinder = (MyService.Binder) iBinder;
myBinder.getMyService().setCallback(new MyService.Callback(){
@Override
public void onDataChange(String data) {
Message msg = new Message();
Bundle b = new Bundle();
b.putString("data",data);
}
});
}