
①从设计的角度来讲:
AndroID的Activity的设计与Web页面非常类似,从页面的跳转通过连接,以及从页面的定位通过URL,从每个页面的独立封装等方面都可以看出来,它主要负责与用户进行交互。
Service则是在后台运行,默默地为用户提供功能,进行调度和统筹。如果一棵树的地上部分是Activity的话,它庞大的根须就是Service。AndroID的服务组件没有运行在独立的进程或线程中,它和其他的组件一样也在应用的主线程中运行,如果服务组件执行比较耗时的 *** 作就会导致主线程阻塞或者假死,从而无法响应用户的 *** 作。
因此,耗时的 *** 作不要放在UI线程中,因为UI 5S,广播10s就阻塞了,会引发ANR。
②从使用的角度来讲:
Service不仅可以给Activity建立双向连接,为Activity提供数据和功能支持,也可以单向接受Intent的请求,进行数据的分析处理和功能调度。
③从扮演的角色来讲:
Activity的功能比较单一,主要就是显示应用所具有的一些功能,帮助用户与应用进行交互,像一个人的脸。而Service可能扮演功能调度者也能扮演功能提供者,从触发器收集信息进行分析和处理,然后更新界面,修改数据或进行其他 *** 作时是一个功能调度者,从输入法的选择考虑Service扮演的就是一个功能提供者。VIEw组件是AndroID中用户能够实实在在看到的部分,如按钮,输入框等就是继承自这个类,VIEw只有装入Activity这样的容器中才有意义,而反过来Activity装入了这些VIEw后才能够成功完成与用户交互的任务,但是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方法。
public class MsgService extends Service { public MsgService() { } /** * 进度条的最大值 */ public static final int MAX_PROGRESS = 100; /** * 进度条的进度值 */ private int progress = 0; /** * 增加get()方法,供Activity调用 * * @return 下载进度 */ public int getProgress() { return progress; } /** * 模拟下载任务,每秒钟更新一次 */ public voID startDownLoad(){ new Thread(new Runnable() { @OverrIDe public voID run() { while(progress < MAX_PROGRESS){ progress += 5; //进度发生变化通知调用方 if(onProgressListener != null){ onProgressListener.onProgress(progress); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printstacktrace(); } } } }).start(); } @OverrIDe public IBinder onBind(Intent intent) { return new mybinder(); } public class mybinder extends Binder { public MsgService getService() { return MsgService.this; } } public interface OnProgressListener { voID onProgress(int progress); } /** * 更新进度的回调接口 */ private OnProgressListener onProgressListener; /** * 注册回调接口的方法,供外部调用 * * @param onProgressListener */ public voID setonProgressListener(OnProgressListener onProgressListener) { this.onProgressListener = onProgressListener; }}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技术。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
总结以上是内存溢出为你收集整理的Android Activity 与Service进行数据交互详解全部内容,希望文章能够帮你解决Android Activity 与Service进行数据交互详解所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)