(Android数据传递)Service和Activity之间-- 借助BroadcastReceiver--的数据传递
实现逻辑如下:
左侧为Activity中的执行逻辑,右侧为Service中的执行逻辑:

/**
* <功能描述> Service和Activity之间的数据交互;具体表现为: 1. 从Service获取数据源,传递到Activity中; 2.
* 在Activity中作数据更新; 3. Service中的onCreate()在UI线程中执行,作延时需要在子线程中执行;
*
* @author Administrator
*/
public class MainActivity extends Activity {
private static final String TAG = "Demo";
private TextView mTvContent;
private Intent mIntent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
registerReceiver();
initData();
}
/**
* <功能描述> 初始化视图
*
* @return void [返回类型说明]
*/
private void initView() {
setContentView(R.layout.activity_main);
mTvContent = (TextView) findViewById(R.id.tv_data);
}
/**
* <功能描述> 初始化数据
*
* @return void [返回类型说明]
*/
private void initData() {
mIntent = new Intent(MainActivity.this, CountService.class);
startService(mIntent);
}
/**
* <功能描述> 注册广播
*
* @return void [返回类型说明]
*/
private void registerReceiver() {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.spt.activity.CountService");
MainActivity.this.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle bundle = intent.getExtras();
mTvContent.setText(bundle
.getInt("com.spt.CountService.count_data") + "");
Log.d(TAG, "count_data=" + mTvContent.getText());
}
}, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (true) {
stopService(mIntent);
}
}
}
需要在MainActivity中注册能够接收Service发送的数据更新广播:com.spt.activity.CountService;并获取到更新后的数据,显示即可。
还需要注意的是:开启服务后,还要停止服务。否则该服务会一直在后台运行。
还发现,使用这种方式同样能够停止该Service:
stopService(new Intent(MainActivity.this, CountService.class));
CountService服务代码如下:
public class CountService extends Service {
private int countService = 0;
private boolean isServiceRunning = false;
@Override
public void onCreate() {
super.onCreate();
isServiceRunning = true;
// 创建子线程作计数
new Thread(new Runnable() {
@Override
public void run() {
while (isServiceRunning) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
countService++;
Intent intent = new Intent();
intent.putExtra("com.spt.CountService.count_data", countService);
intent.setAction("com.spt.activity.CountService");
// Service中发送广播
sendBroadcast(intent);
}
}
}).start();
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
isServiceRunning = false;
countService = 0;
}
}
总结和疑问:
1. 使用Broadcast广播方式实现服务和宿主之间的数据交互,容易造成性能不高的问题;
2. 广播发送的时间不确定性因素,导致数据交互有延时;
(Android数据传递)Service和Activity之间-- 借助BroadcastReceiver--的数据传递的更多相关文章
- Android Service与Activity之间通信的几种方式
在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...
- android第一行代码-3.activity之间的调用跟数据传递
前面两节所有应用都是同一个activity中的,是时候讲activity之间交互的操作了,此后会涉及到intent这个概念,这也算一个新的里程碑开始. 主要内容包括intent的使用,以及activi ...
- android中使用Intent在activity之间传递数据
android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...
- Android笔记(四) Activity之间的数据传递
我们之前使用Intent进行Activity之间的跳转,其实Intent还可以在启动活动的时候传递数据. Intent提供了一系列的putExtra方法以便我们把想要传递的数据暂存在Intent中,待 ...
- 37.Activity之间的转换以及数据的传递(Intent)学习
Intent简介: 在一个Androi ...
- Android中Service和Activity之间的通信
启动Service并传递数据进去: Android中通过Intent来启动服务会传递一个Intent过去. 可以在Intent中通过putExtra()携带数据 Intent startIntent ...
- Android进阶之Fragment与Activity之间的数据交互
1 为什么 因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. 2 Activity把值传递给Fragment 2.1 第一种方式,也是最常用的 ...
- Android Service与Activity之间通信
主要分为: 通过Binder对象 通过broadcast(广播)的形式 Activity调用bindService (Intent service, ServiceConnection conn, i ...
- 关于android编程中service和activity的区别
一. 绝大部分情况下,Service的作用是用来“执行”后台的.耗时的.重要的任务,三者缺一不可,而最重要的原因是第三点:要执行重要的任务. 因为当一个进程启动了Service后,进程的优先级变高了, ...
随机推荐
- linux+jenkins+jmeter+ant持续集成
0.安装jdk 1.下载jdk8 登录网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151 ...
- Chrome开发者控制台操作教程
1清空控制台 在控制台下有个clear console的按钮,点击的时候会清空控制台. 清空控制台 2让Chrome中的页面可编辑 有的时候我们需要临时改变页面上的文字,图案等信息,一种常见的方法是 ...
- excel 中怎么让两列姓名相同排序(转)
如图,A列B列不动,C列和D列行值不变,以A列姓名为主让C列姓名和A列相同姓名的对齐(行),D行跟着C行不变. 在E1输入公式=MATCH(C1,A:A,0)然后下拉,接著选中C,D,E列,以E列为标 ...
- 【C++ Primer | 08】IO库
IO类 C++的输入输出分为三种: (1)基于控制台的I/O (2)基于文件的I/O (3)基于字符串的I/O istringstream类 描述:从流中提取数据,支持 >> 操作 这里字 ...
- mysql查看工具——mysql profiler sql
http://www.profilesql.com/download/ 开发同学的福利--mysql监控工具sqlprofiler,类似sqlserver的profiler工具 https://www ...
- Linux使用退格键时出现^H ^?解决方法
Linux使用退格键时出现^H ^?解决方法 在linux下执行脚本不注意输错内容需要删除时总是出现^H ^H不是H键的意思,是backspace.主要是当你的终端backspace有问题的时候才需要 ...
- haproxy admin_stats端口启动错误解决
/var/log/message里的错误消息大概如下: Feb 13 09:32:50 cluster-node2 haproxy-systemd-wrapper: [ALERT] 043/09325 ...
- Visual Studio 2012 Update 3
不知道是不是都关注Win8.1和Visual Studio 2013 preview去了… 貌似没大有人发现2012的update3在update2后2月就出了… ms明显加快了开发速度额… KB a ...
- springboot学习(一):创建项目
package com.glory.demo.Controller; import org.springframework.stereotype.Controller; import org.spri ...
- LeetCode高频148错题记录
3. Max Points on a Line 共线点个数3种解法 思路一:思考如何确定一条直线,两点法,确定斜率后带入一点.有三种情况,1. 两点重合,2. 斜率不存在,3. 正常算,依次以每个点为 ...