首页 > 代码库 > Activity与Service进行数据交互
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 @Override30 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 @Override51 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 onProgressListener75 */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技术。
Activity与Service进行数据交互
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。