Android开发学习之路-回调实现Service向activity传递数据
打开服务项目的情况下,假如我们都是根据bindService来关联服务项目而且要向服务项目传递数据,能够立即在Intent中设定bundle来达到效果,可是如果是大家必须从服务项目中回到一些数据信息到Activity中的情况下,完成起來就会有各式各样的方式,例如应用回调函数,应用广播节目这些,今日说的是应用回调函数的方式。
新创建一个工程项目,并撰写一个服务项目:
public class MyService extends Service { private boolean connecting = false; private Callback callback; @Nullable @Override public IBinder onBind(Intent intent) { return new Binder(); } public class Binder extends android.os.Binder { public MyService getService() { return MyService.this; } } @Override public void onCreate() { super.onCreate(); connecting = true; new Thread(new Runnable() { @Override public void run() { int i = 0; while (connecting == true) { i ; if (callback != null) { callback.onDataChange(i ""); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } public void setCallback(Callback callback) { this.callback = callback; } public static interface Callback { void onDataChange(String data); } @Override public void onDestroy() { super.onDestroy(); connecting = false; } }
在服务项目中的onCreate方式中,大家打开了一个进程来仿真模拟服务项目的运作,并在进程每过1s中给独享自变量i取值增长,随后大家撰写了一个公有制的插口Callback,而且界定了一个该插口的独享组员,而且在onCreate方式中启用了插口里边的涵数onDataChange。下面大家自定了一个Binder的子类并在这个类中界定了涵数回到当今的这一Service,这儿的目地便是在Activity中能够浏览到这一Service的回调函数插口Callback并完成该插口的方式。
Activity编码以下:
public class MainActivity extends AppCompatActivity implements View.OnClickListener, ServiceConnection { private TextView tvOut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tvOut = (TextView) findViewById(R.id.tvOut); findViewById(R.id.btnBindService).setOnClickListener(this); } @Override public void onClick(View v) { bindService(new Intent(this, MyService.class), this, BIND_AUTO_CREATE); } @Override public void onServiceConnected(ComponentName name, IBinder service) { MyService.Binder binder = (MyService.Binder) service; MyService myService = binder.getService(); myService.setCallback(new MyService.Callback() { @Override public void onDataChange(String data) { Message msg = new Message(); msg.obj = data; handler.sendMessage(msg); } }); } @Override public void onServiceDisconnected(ComponentName name) { } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); tvOut.setText(msg.obj.toString()); } }; }
由于服务项目关联后,会从onBind方式中回到一个Binder目标,这一目标会在onServiceConnectde方式中获得到,因此 大家先从Binder目标中获得到大家从服务项目传送回来的MyService目标,随后启用MyService目标的setCallback方式来设定大家必须的解决逻辑性,这儿是把i的值复印出去,由于服务项目中打开了进程,因此 这儿也不可以立即升级UI。
小结:回调函数体制是Java中的一个关键特点,在Android中应用到的地区很普遍,比如大家给按键设置点击事件等。这儿的回调函数,实际上是根据在推送端界定回调函数插口,而且启用插口的回调函数方式,随后在协调器完成该插口的方式。只需插口被启用了,便会回调函数协调器的被完成了的方式,那样数据信息就能传送回来。
留意:打开的服务项目是在主线任务程中运作的,假如在服务项目中打开了进程,那麼在子进程中就不可以立即升级UI