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)