zoukankan      html  css  js  c++  java
  • Activity和Service交互之bindService(回调更新UI)

    一.回调接口

    public interface OnProgressListener {
        void onProgress(int progress);
    }

    二.Service代码

    public class MyService extends Service {
    
        private int progress = 0;
        private OnProgressListener onProgressListener;
    
        class DownLoadBinder extends Binder{
            public MyService getService(){
                return MyService.this;
            }
        }
    
    
        // 设置回调接口
        public void setOnProgressListener(OnProgressListener onProgressListener){
            this.onProgressListener = onProgressListener;
        }
    
        @Nullable
        @Override
        public IBinder onBind(Intent intent) {
            return new DownLoadBinder();
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
        }
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            return super.onStartCommand(intent, flags, startId);
        }
    
    
    
        // 模拟下载
        public  void startDownload(){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (progress<100){
                        progress += 10;
                        // 通知调用方
                        if( onProgressListener != null  ){
                            onProgressListener.onProgress(progress);
                        }
                        try {
                            Thread.sleep(1000);
                        }catch (InterruptedException e){
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
    
        // 获取progress
        public int getProgress(){
            return progress;
        }
    
        @Override
        public void onDestroy() {
            super.onDestroy();
            Log.e("Service", "onDestroy");
        }
    }

    三.Activity关键代码:

    public class MainActivity extends Activity {
    
        private ProgressBar progressBar;
        private MyService myService;
        private int progress = 0;
    
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            progressBar = (ProgressBar)findViewById(R.id.progressBar);
    
            Intent intent = new Intent(this, MyService.class);
            // 标志位BIND_AUTO_CREATE是的服务中onCreate得到执行,onStartCommand不会执行
            bindService(intent,conn, Context.BIND_AUTO_CREATE);
        }
    
    
    
        protected void myClick(View v){
            if( v.getId() == R.id.btn ){
                myService.startDownload();
            }
    
            if( v.getId() == R.id.btn2 ){
                unbindService(conn);
            }
        }
    
        @Override
        protected void onPause() {
            super.onPause();
        }
    
    
        @Override
        protected void onStop() {
            super.onStop();
        }
    
        @Override
        protected void onDestroy() {
        unbindService(conn);
            super.onDestroy();
        }
    
        ServiceConnection conn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                myService = ((MyService.DownLoadBinder)service).getService();
    
                // 回调接口
                myService.setOnProgressListener(new OnProgressListener() {
                    @Override
                    public void onProgress(int progress) {
                        progressBar.setProgress(progress);
                    }
                });
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
    
            }
        };
    }
  • 相关阅读:
    委托与事件
    JSON
    JavascriptBoolean运算符
    SQL执行字符串
    ref和out与SQL中的output
    早绑定、晚绑定
    浅复制和深复制
    Android Fragments 详细使用
    Android 两种为自定义组件添加属性的使用方法和区别
    Gallery 3D+倒影 滑动切换图片示例(转)
  • 原文地址:https://www.cnblogs.com/itfenqing/p/6753143.html
Copyright © 2011-2022 走看看