Android Service 通知Activity更新界面的方法研究
Android Service 通知Activity更新界面的方法研究
Android的最重要的组件式service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题。当然今天我们不研究底层的实现问题,我从上层的应用的如何使用的角度进行研究。
首先Activity调用Service
这个是比较基础的,它有两种常见的方法;
第一, 通过Intent,这个比较简单了,可以指定package name和class name的方式来调用,Intent.setClassName这个成员即可。通过putString来装载数据,startService(intent)即可例子如下:
Intent regIntent = new Intent(“com.service”);
regIntent.putExtra(“data”, "helloData");
startService(regIntent);
第二, 通过IPC,这个比较麻烦,一般用不着,这里不谈
但是,反过来,Service如何将一些状态告诉Activity呢?方法有两种
第一、 service 通过广播的形式发送broadcast,我们写一个broadcastReceiver即可,通常的情况,将broadcastReceiver写成Activity的内部类,这个onReceiver可以直接调用activity的方法来更新界面。但是内部类只能采用代码注册的方法registerReceiver(),不能再AndroidManifest.xml文件中进行静态的声明,因为内部类要依赖于外部类而存在的。如果你一定要用AndroidManifest来注册receiver,那么只能把broadcastReceiver写成单独的文件的public类。这时候,你想更新界面就比较麻烦了,你只能自己把你要更新的activity运行起来,然后再向这个activity的内部类发广播的消息来更新界面
第二、 service直接向activity发intent。在service里面进行startActivity是属于在Activity外startActivity即在task外启动activity,因此,必须在intent加入一个参数如下:Intent intentSend = new Intent(Constants.ACTION_STATUS);
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent1.putExtra(“statues“,“end“);
context.startActivity(intent1);
但是此时会引发的一个问题是,多次startActivity会导致很多的activity实现被运行,这肯定不是我们要的,我只要一个Activity就可,此时,我们要在androidManifest里面对这个activity的launchMode设置为singleInstance
<activity android:name="com.demo.Activity"
android:label="@string/online" android:launchMode="singleInstance">
记住啦,有人设置为singleTask,也可以,但他们有一点区别。
同时记住要更新intent,这样getInstent才可以得到每次的新实例
@Override
protected void onNewIntent (Intent intent){
setIntent(intent);
}
Android Service 通知Activity更新界面的方法研究的更多相关文章
- Android:Service通知Activity更新界面
Android有四大组件,其中包括service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题. 1.首先Activity调用Service 这个是比较基础的,它有两种 ...
- Android线程间通信更新UI的方法(重点分析EventBus)
Android的UI更新只能在UI线程中,即主线程.子线程中如果要进行UI更新,都是要通知主线程来进行. 几种实现方式总结如下,欢迎补充. 1.runOnUiThread() 子线程中持有当前Acti ...
- Android—Service与Activity的交互
service-Android的四大组件之一.人称"后台服务"指其本身的运行并不依赖于用户可视的UI界面 实际开发中我们经常需要service和activity之间可以相互传递数据 ...
- Android Service与Activity之间通信的几种方式
在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...
- Android Service与Activity的交互
Android中有时候需要在Service中改变Activity的UI,或者在Activity中修改Service中的数值.首先必须使用与Activity绑定的Service,有三种方式可以实现.第一 ...
- Android service ( 一 ) 三种开启服务方法
一. Service简介 Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),它跟 Activ ...
- Android Service与Activity之间通信
主要分为: 通过Binder对象 通过broadcast(广播)的形式 Activity调用bindService (Intent service, ServiceConnection conn, i ...
- Android app启动activity并调用onCreate()方法时都默默地干了什么?
Android app启动activity并调用onCreate() 方法时都默默地干了什么? 在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...
- Android Service 通过 BroadcastReceiver 更新Activity UI
1:MainActivity.java public class MainActivity extends Activity { private TextView tvInfo = null; pri ...
随机推荐
- [CSAcademy]Colored Forests
csacademy description 有\(M\)种颜色编号为\(1-M\).现给树上的每个点染上这\(M\)种颜色中的一种,定义一棵树是\(\mbox{colorful}\)的当且仅当这棵树上 ...
- mongodb启用Profiling定位问题
建议使用方法三,最简单且容易查看 一:如果mongodb已经运行了很长时间,此时查看mongod.log很大,没法打开查看相应信息 #ps -ef|grep mongod 找到相应的mongod的进程 ...
- Oracle密码中含有特殊字符时exp,imp的使用
今天通过exp迁移Oracle 数据,由于密码含有很有很多特殊字符,弄了好久,都没成功,后发在网上找到方法. 1 exp用法Linux 下(密码用一对双引号, 整体userid用对单引号括住)exp ...
- mysql update 没有where 不能更新的安全保护设置
http://www.cnblogs.com/wjoyxt/p/5620827.html 没有where 不能更新的安全保护设置 http://dev.yesky.com/429/3543292 ...
- VMware ESX常用命令 和 IP 地址修改
一. VMware ESX Command 1. 看你的esx版本 vmware –v 2. 查看显示ESX硬件,内核,存储,网络等信息 esxcfg-info -a(显示所有相关的信息) esxcf ...
- VS2017开发Linux平台上的程序
重装系统后安装VS2015时卡住了,于是试试看VS2017怎样,听说还支持调Linux.发现VS2017跟12/13/15又有了新的飞跃,竟然支持模块化下载,对于我这种主要写C++简直是个福音,勾了L ...
- 异步FIFO中空满信号如何产生?
异步FIFO中,空满信号该如何产生呢? 在复位的时候,读指针和写指针相等,读空信号有效(这里所说的指针其实就是读地址.写地址)当读指针赶上写指针的时候,写指针等于读指针意味着最后一个数据被读完,此时读 ...
- web攻击之一:XSS跨站脚本
一.浏览器安全 同源策略 影响源的因素:host,子域名,端口,协议 a.com通过以下代码: <script scr=http://b.com/b.js> 加载了b.com上的b.js, ...
- C# CS1591 缺少对公共可见类型或成员的 XML 注释 问题解决
最近在写web api的项目,用到微软的Web api help page组件,用于自动对生成API文档,见博文: https://www.cnblogs.com/lenmom/p/9081363.h ...
- 关于RDS for mysql中导入数据库set global event_scheduler =1 需要更多超级权限
关于RDS中导入数据库set global event_scheduler =1 需要更多超级权限 报错提示 其实这个意思是 让mysql自动启动 计划任务 如果在 命令行下 查询 SHOW VAR ...