1、绑定服务可以调用里面的方法,为什么?
Service onBind返回Ibinder,Activity中绑定服务时得到当前服务的引用,可以使用引用执行服务里面的方法。
MyService.MyBinder binder;
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyBinder) service;
}
};
Activity和Service交互的几种方式:
1)将Activity中的handler传给Service
2)Activity中设置接口回调
2)Activity中设置接口回调
3)广播
public class MainActivity extends Activity implements IServiceMethod{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
System.out.println(msg.arg1);
};
};
public void btn(View v) {
switch (v.getId()) {
case R.id.btn1:
startService(new Intent(this, MyService.class));
break;
case R.id.btn2:
stopService(new Intent(this, MyService.class));
break;
case R.id.btn3:
bindService((new Intent(this, MyService.class)), conn,
Context.BIND_AUTO_CREATE);
break;
case R.id.btn4:
unbindService(conn);
break;
case R.id.btn5:
binder.getService().startDownLoad();
// binder.getService().setHandler(handler);
binder.getService().setDataChange(this);
break;
default:
break;
}
}
MyService.MyBinder binder;
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (MyBinder) service;
}
};
@Override
public void test(int i) {
System.out.println(i+"====");
}
public class MyService extends Service{
public final static String TAG="MyService";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy");
}
@Override
public boolean onUnbind(Intent intent) {
Log.d(TAG, "onUnbind");
return super.onUnbind(intent);
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return new MyBinder();
}
Handler handler;
public void setHandler(Handler handler){
this.handler=handler;
}
IServiceMethod iServiceMethod;
public void setDataChange(IServiceMethod iServiceMethod){
this.iServiceMethod=iServiceMethod;
}
public class MyBinder extends Binder{
public MyService getService(){
return MyService.this;
}
}
public void startDownLoad(){
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//handler方式往Activity传数据
// Message msg=new Message();
// msg.arg1=5;
// handler.sendMessage(msg);
//接口回调方式往Activity传数据
iServiceMethod.test(5);
}
}).start();
}
}
public interface IServiceMethod {
void test(int i);
}
4)第三方工具(EventBus)