zoukankan      html  css  js  c++  java
  • Activity与Service进行数据交互

    Android启动Service有两种方法,一种是startService,一种是bindService。生命周期如下:

    执行startService时,调用者如果没有stopService,Service会一直在后台运行。多次调用startService,该Service只能被创建一次,即该Service的onCreate方法只会被调用一次。但是每次调用startService,onStartCommand方法都会被调用。

    执行bindService时,调用者调用unbindService方法或者调用者Context不存在了(如Activity被finish了)。第一次执行bindService时,onCreate和onBind方法会被调用,但是多次执行bindService时,onCreate和onBind方法并不会被多次调用,即并不会多次创建服务和绑定服务。 多个组件可以同时绑定到该服务,但全部取消绑定后,该服务即会被销毁。

    既使用startService又使用bindService的情况,需要unbindService和stopService同时调用才会终止Service。

    Activity与Service交互有两种方法:一种是使用broadcast,另一种是使用bindService。本文只介绍bindService方法。

     1 public class MsgService extends Service {
     2     public MsgService() {
     3     }
     4 
     5     /**
     6      * 进度条的最大值
     7      */
     8     public static final int MAX_PROGRESS = 100;
     9     /**
    10      * 进度条的进度值
    11      */
    12     private int progress = 0;
    13 
    14     /**
    15      * 增加get()方法,供Activity调用
    16      *
    17      * @return 下载进度
    18      */
    19     public int getProgress() {
    20         return progress;
    21     }
    22 
    23     /**
    24      * 模拟下载任务,每秒钟更新一次
    25      */
    26     public void startDownLoad(){
    27         new Thread(new Runnable() {
    28 
    29             @Override
    30             public void run() {
    31                 while(progress < MAX_PROGRESS){
    32                     progress += 5;
    33 
    34                     //进度发生变化通知调用方
    35                     if(onProgressListener != null){
    36                         onProgressListener.onProgress(progress);
    37                     }
    38 
    39                     try {
    40                         Thread.sleep(1000);
    41                     } catch (InterruptedException e) {
    42                         e.printStackTrace();
    43                     }
    44 
    45                 }
    46             }
    47         }).start();
    48     }
    49 
    50     @Override
    51     public IBinder onBind(Intent intent) {
    52         return new MyBinder();
    53     }
    54 
    55     public class MyBinder extends Binder {
    56         public MsgService getService() {
    57             return MsgService.this;
    58         }
    59     }
    60 
    61     public interface OnProgressListener {
    62         void onProgress(int progress);
    63     }
    64 
    65     /**
    66      * 更新进度的回调接口
    67      */
    68     private OnProgressListener onProgressListener;
    69 
    70 
    71     /**
    72      * 注册回调接口的方法,供外部调用
    73      *
    74      * @param onProgressListener
    75      */
    76     public void setOnProgressListener(OnProgressListener onProgressListener) {
    77         this.onProgressListener = onProgressListener;
    78     }
    79 
    80 }
    public class MainActivity extends Activity {
    
        private Button button19;
    
        private MsgService msgService;
        private int progress = 0;
        private ProgressBar mProgressBar;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
    
    
    
            btnExec = (Button) findViewById(R.id.btnExec);
            button19 = (Button) findViewById(R.id.button19);
            mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
    
    
            button19.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    msgService.startDownLoad();
                }
            });
    
            Intent intent = new Intent(this, MsgService.class);
            bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
    
    
    
        }
    
    
    
    
    
        ServiceConnection mServiceConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                msgService = ((MsgService.MyBinder) iBinder).getService();
    
                msgService.setOnProgressListener(new MsgService.OnProgressListener() {
                    @Override
                    public void onProgress(int progress) {
                        mProgressBar.setProgress(progress);
                    }
                });
            }
    
            @Override
            public void onServiceDisconnected(ComponentName componentName) {
    
            }
        };
    
    
        @Override
        protected void onDestroy() {
    
            unbindService(mServiceConnection);
            super.onDestroy();
        }
    }

    例子中,MsgService模拟耗时的下载任务,MainActivity 绑定服务,通过注册OnProgressListener回调获取下载进度,更新进度条。

    本例子Activity和Service是在同一个进程中,对于跨进程调用Service需要使用到AIDL技术。

  • 相关阅读:
    Codeforces Round #344 (Div. 2) C. Report 其他
    Codeforces Round #344 (Div. 2) B. Print Check 水题
    Codeforces Round #344 (Div. 2) A. Interview 水题
    8VC Venture Cup 2016
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂 中二版
    CDOJ 1280 772002画马尾 每周一题 div1 矩阵快速幂
    CDOJ 1279 班委选举 每周一题 div2 暴力
    每周算法讲堂 快速幂
    8VC Venture Cup 2016
    Educational Codeforces Round 9 F. Magic Matrix 最小生成树
  • 原文地址:https://www.cnblogs.com/l2rf/p/5953214.html
Copyright © 2011-2022 走看看