当前位置:天才代写 > tutorial > 安卓教程 > Android开发学习之路-回调实现Service向activity传递数据

Android开发学习之路-回调实现Service向activity传递数据

2021-02-23 15:28 星期二 所属: 安卓教程 浏览:11

打开服务项目的情况下,假如我们都是根据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

 

 

    关键字:

天才代写-代写联系方式