位置: 编程技术 - 正文

Service通信详解(service segment)

编辑:rootadmin

推荐整理分享Service通信详解(service segment),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:servicemessage,service msg,service和serviceimpl示例,service msg,servicent,,servicemessage,servicent,内容如对您有帮助,希望把文章链接给更多的朋友!

1.使用Intent进行异步通讯

在Service任务一旦完成后,就发送广播。开发者只需要实现一个BroadcastReceiver来监听响应既可。

Activity.startService启动intentService,intentService完成任务后sendBroadcast()发送广播,BroadcastReceiver.startActivity()通知Activity操作结果。

在任务结束后调用sendBroadcast(new Intent(Action));

然后在广播中通知Activity执行的结果。这种方法的优点是,Android提供了现成的机制,而不需要开发者自己构建复杂的组件间消息处理系统。

缺点是通知的结果受限于Intent,该方法也不适合在IntentService和Activity之间进行大规模快速更新操作,比如进度条,因为这会阻塞系统。

具体的代码就不多讲,和基本的Service一样使用,只是多实现了个广播.

2.本地绑定Service

本地绑定Service可以在Service中给Activity提供更复杂的回调,因为那些耗时的操作必须放到Service的后台线程中,所以Service大部分回调应该是异步的。实际的调用触发后台操作立即返回,一旦操作完成,Service使用回调接口来通知Activity相应的执行结果.

Service通信详解(service segment)

下面的例子添加了一个回调接口和一个实现AsyncTask的类,该类用来模拟后台操作。Service的onBind()方法返回一个localBinder对象,通过该对象客户端可以获取Service引用,并能执行doLongRunningOperation()方法。此方法创建了一个新的AsyncTask,并用客户端传递进来的参数执行execute()函数,在执行的过程中,回调函数会通知客户端新进度,当执行完毕会回调执行结果.

这个例子以下载图片讲解其详细的实现步骤

public class MyLocalService extends Service {private static final int NOTIFICATION_ID = ;//通知的IDprivate LocalBinder mLocalBinder = new LocalBinder();//用于返回的localBinder对象private Callback mCallback;@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn this.mLocalBinder;}public class LocalBinder extends Binder {public MyLocalService getService() {return MyLocalService.this;}}public void setCallback(Callback callback) {this.mCallback = callback;}//回调接口,便于Activity与Service进行通信public interface Callback {void onOperationProgress(int progress);void onOperationCompleted(String result);}public void doLongRunningOperation(String urlString) {new MyAsyncTask().execute(urlString);}private class MyAsyncTask extends AsyncTask<String, Integer, String> {//处理任务之中@Overrideprotected String doInBackground(String... params) {publishProgress(0);//更新进度条String result = downloadPhoto(params[0]);publishProgress();return result;}//执行任务之前@Overrideprotected void onPreExecute() {super.onPreExecute();startForeground(NOTIFICATION_ID, buildNotification());//保持服务一直处于活跃状态。并创建通知}//返回任务执行结果@Overrideprotected void onPostExecute(String result) {if (mCallback != null) {mCallback.onOperationCompleted(result);}mCallback.onOperationProgress();stopForeground(true);}//进度条更新@Overrideprotected void onProgressUpdate(Integer... values) {if (mCallback != null && values.length > 0) {for (Integer value : values) {mCallback.onOperationProgress(value);}}}//任务(结束)调用取消后@Overrideprotected void onCancelled(String result) {// TODO Auto-generated method stubsuper.onCancelled(result);stopForeground(true);}}//创建通知private Notification buildNotification() {Builder builder = new Builder(this);builder.setSmallIcon(R.drawable.ic_launcher);builder.setContentTitle("正在下载");builder.setContentText("图片还在下载中");Notification notification = builder.getNotification();return notification;}//下载图片private String downloadPhoto(String uriString) {HttpURLConnection conn = null;try {Thread.sleep();URL url = new URL(uriString);conn = (HttpURLConnection) url.openConnection();conn.setRequestMethod("GET");conn.setReadTimeout();conn.setConnectTimeout();InputStream is = conn.getInputStream();File file = new File(Environment.getExternalStorageDirectory().toString() &#; "/" &#; "book.jpg");FileOutputStream fos = new FileOutputStream(file);byte[] buf = new byte[];int line = 0;while ((line = is.read(buf)) != -1) {fos.write(buf, 0, line);}fos.close();return "下载完成";} catch (Exception e) {e.printStackTrace();} finally {if (conn != null) {conn.disconnect();}}return "下载失败";}}

下面的代码显示了更新后的Activity,&#;得注意的变化是Activity实现了MyLocalService.Callback接口,当在onServiceConnected()方法中获取到对Service的引用后,调用setCallback(this)方法,以便于Activity能在操作执行期间收到回调通知。还有一点非常重要,当用户离开Activity或者调用onPause()时,不要忘记移除回调监听,否则可能导致内存泄漏。

public class MainActivity extends Activity implements ServiceConnection,MyLocalService.Callback {private Button start;private TextView content;private MyLocalService mService;private ProgressDialog dialog;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);this.start = (Button) findViewById(R.id.start);this.content = (TextView) findViewById(R.id.content);

}

//启动Service里的AsyncTask线程

public void onTriggerLongRunningOperation(View view) {if (this.mService != null) {this.mService.doLongRunningOperation(" void onOperationProgress(int progress) {if (dialog == null) {dialog = new ProgressDialog(this);dialog.setMessage("正在下载");dialog.setMax();dialog.setCanceledOnTouchOutside(false);dialog.show();} else {dialog.setProgress(progress);}if (progress == && dialog != null) {dialog.dismiss();}}@Overridepublic void onOperationCompleted(String result) {this.content.setText(result);//设置下载图片的返回结果}//绑定服务后的初始化操作都写在该方法内@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {this.mService = ((MyLocalService.LocalBinder) service).getService();this.mService.setCallback(this);this.start.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {onTriggerLongRunningOperation(v);//执行Service下载线程start.setEnabled(false);//设置启动按钮为不可用}});}//注销之前结束后的收尾操作@Overridepublic void onServiceDisconnected(ComponentName name) {this.mService = null;}@Overrideprotected void onResume() {super.onResume();Intent bindIntent = new Intent(this, MyLocalService.class);bindService(bindIntent, this, BIND_AUTO_CREATE);//绑定Service}@Overrideprotected void onPause() {super.onPause();if (this.mService != null) {this.mService.setCallback(null);unbindService(this);//解绑Service}}}

如果用户在操作执行完前离开了Activity,Service还会继续执行,因为显式调用了StartForeground()方法。如果Activity在操作结束前又重新恢复,它会在成功绑定到Service后继续调用继续接受回调。这种行为很容易把耗时的操作和用户界面分开。并且允许Activity恢复后还能继续获取运行的状态。

如果Service内部维护了一些状态,允许客户端获取这些状态以及订阅这些状态的变化是个很好的做法。因为当Activity重新恢复并绑定到Service后,这些状态可能已经发生了变化.

Android roboguice 开源框架使用 Androidroboguice应用开源的roboguice是一个依赖注入框架,如果你用过Spring应该知道其好处。减少程序员的负担,代码变的更加简洁。地址:

android中Handler学习心得 在android开发中,Handler消息发送和处理几乎无处不在。稍微复杂一点的Activity,需要运行时更新UI一般都会使用Handler,特别是在非UI线程中更新UI必须使用

Android UI之TableLayout(表格布局) 说明:表格布局采用常见的表格方式来表示布局,与上文中提到的android:weight属性显示出来的效果有些相似。而事实上,TableLayout的确是LinearLayout的子类

标签: service segment

本文链接地址:https://www.jiuchutong.com/biancheng/378167.html 转载请保留说明!

上一篇:android之tween动画详解(android中的动画有哪几类,它们的特点和区别是什么?)

下一篇:Android roboguice 开源框架使用

  • 新建厂房装修费是否计入固定资产
  • 企业所得税汇算清缴退税怎么做账
  • 办公费税前扣除标准2023
  • 银行本票与银行本票存款的区别
  • 转登记纳税人留抵退税政策
  • 合同取得成本如何分析
  • 利润表中第3栏营业税金及附加等于什么
  • 退回来的增值税税费怎么做账务处理
  • 冲销暂估入账原材料的会计分录
  • 应收账款客户少了几毛没有付怎么处理
  • 支付的水电费属于什么会计科目
  • 不属于抵扣范围的是什么
  • 从免税到征税企业应该怎么做
  • 税务登记号和统计号区别
  • 企业固定资产的盘亏净损失
  • 总公司给分公司钱
  • 营业外收入可以在借方吗
  • 以下凭证免征印花税的有
  • 应收代位偿款
  • 筹建期间开办费账务处理
  • 总公司汇总申报怎么弄
  • 委外开发费用可以加计扣除吗
  • 租金税率9%和5
  • 外经证作废流程
  • 按年缴纳年金的企业缴费部分,应按照全年一次性奖金
  • 原材料暂估入库怎么做账
  • 企业研发人员数量在哪里查
  • 固定资产更改折旧年限怎么账务处理
  • 对公账户资金往来会产生税吗
  • win11前面板耳机没声音
  • 企业利润分配的原则
  • 印花税的计税依据是含税还是不含税
  • PHP:mb_ereg_search_getregs()的用法_mbstring函数
  • adb是什么程序
  • vue3 vue.config.js配置Element-plus组件和Icon图标实现按需自动引入
  • win7纯净版系统之家
  • 新税法减免项目
  • 融资租入固定资产是什么意思
  • xml格式化输出
  • 外汇申报是什么意思
  • 固定资产为什么提折旧,有何实际意义
  • 前端权限控制实战
  • php实现文件上传的函数
  • 物流公司主营业务怎么写
  • 车船税为什么没有发票
  • 没有以前年度损益调整怎么办
  • 已认证发票对方作废后不重开怎么办
  • 刻章费用如何做账务处理
  • 专用发票跨月冲红流程
  • 福利费为什么通过应付职工薪酬科目要紧吗
  • 加油的电子发票在哪里找
  • 转让旧固定资产怎么处理
  • 公积金贷方有余额如何做调整分录
  • 企业计提固定资产折旧以什么假设为前提
  • 小规模纳税人增值税专用发票税率
  • 新公司第一年年度总结
  • 红冲更正的正确分录
  • 一般纳税人其他咨询服务税率
  • 固定资产处置当月需要计提折旧吗
  • 红冲暂估原材料如何做会计分录
  • 小规模纳税人缴税的分录
  • 出口转内销增值税报表怎么填
  • 专用发票下载怎么操作
  • 其它综合收益包括
  • 应付账款借方余额在资产负债表中怎么列示
  • 加计扣除所得税申报表怎么填写
  • 专用发票与普通发票图片
  • 赠送的产品价格为0怎么做账
  • sqlserver表排序
  • vpengine.exe进程
  • 教你如何解决蓝光机/KODI无法打开局域网smb共享的问题
  • sql2000停止拒绝访问
  • vue拦截器的作用及使用
  • js怎么删除
  • node语句
  • unity特色
  • beautiful python
  • 列举出python的5个数据类型
  • jquery input
  • 百旺税控客服电话
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设