实现逻辑如下:

左侧为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--的数据传递的更多相关文章

  1. Android Service与Activity之间通信的几种方式

    在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ ...

  2. android第一行代码-3.activity之间的调用跟数据传递

    前面两节所有应用都是同一个activity中的,是时候讲activity之间交互的操作了,此后会涉及到intent这个概念,这也算一个新的里程碑开始. 主要内容包括intent的使用,以及activi ...

  3. android中使用Intent在activity之间传递数据

    android中intent传递数据的简单使用: 1.使用intent传递数据: 首先将需要传递的数据放入到intent中 Intent intent = new Intent(MainActivit ...

  4. Android笔记(四) Activity之间的数据传递

    我们之前使用Intent进行Activity之间的跳转,其实Intent还可以在启动活动的时候传递数据. Intent提供了一系列的putExtra方法以便我们把想要传递的数据暂存在Intent中,待 ...

  5. 37.Activity之间的转换以及数据的传递(Intent)学习

      Intent简介:                                                                                在一个Androi ...

  6. Android中Service和Activity之间的通信

    启动Service并传递数据进去: Android中通过Intent来启动服务会传递一个Intent过去. 可以在Intent中通过putExtra()携带数据 Intent startIntent ...

  7. Android进阶之Fragment与Activity之间的数据交互

    1 为什么 因为Fragment和Activity一样是具有生命周期,不是一般的bean通过构造函数传值,会造成异常. 2 Activity把值传递给Fragment 2.1 第一种方式,也是最常用的 ...

  8. Android Service与Activity之间通信

    主要分为: 通过Binder对象 通过broadcast(广播)的形式 Activity调用bindService (Intent service, ServiceConnection conn, i ...

  9. 关于android编程中service和activity的区别

    一. 绝大部分情况下,Service的作用是用来“执行”后台的.耗时的.重要的任务,三者缺一不可,而最重要的原因是第三点:要执行重要的任务. 因为当一个进程启动了Service后,进程的优先级变高了, ...

随机推荐

  1. C++中explicit关键字的作用 (转)

    explicit用来防止由构造函数定义的隐式转换. 要明白它的作用,首先要了解隐式转换:可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换. 例如: class things { ...

  2. Echo()、print()、print_r()区别

    echo可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct),而并不是真正的函数,因此不能作为表达式的一部分使用.echo是php的内部指令,不是函数, ...

  3. ubuntu中vim下按上下左右键时输入A、B、C、D

    ubuntu系统自带的 vi 不完整导致,解决方法:安装完整的vi $ sudo apt-get install vim-gtk 1. 为root用户设置密码 sudo passwd root 需要先 ...

  4. windows下载安装MariaDB10.2.17 绿色版

    1.下载 https://mirrors.tuna.tsinghua.edu.cn/mariadb//mariadb-10.2.17/winx64-packages/mariadb-10.2.17-w ...

  5. Win10任务栏通知区域上已卸载程序无效图标选项如何清除?

    在Win10系统中,大部分用户都已经知道在“选择在任务栏上显示哪些图标”来让一些软年图标显示,一些隐藏,不过使用Win10系统久了之后发现,在设置通知区域图标中有很多已经卸载程序的无效选项!这让设置时 ...

  6. 一脸懵逼学习Storm的搭建--(一个开源的分布式实时计算系统)

    Storm的官方网址:http://storm.apache.org/index.html :集群部署的基本流程(基本套路): 集群部署的流程:下载安装包.解压安装包.修改配置文件.分发安装包.启动集 ...

  7. 磁盘blk_update_request: I/O error

    https://www.cnblogs.com/chris-cp/p/6340289.html

  8. JS高级程序设计2

    面向对象 ,基本模式.对象字面量模式.工厂模式.构造函数模式.原型模式.组合构造函数和原型模式.其他模式见电子书:动态原型模式.寄生构造函数模式(不推荐).稳妥构造函数模式(要求安全的环境,不使用ne ...

  9. yum安装Docker及入门使用

    一.安装 1.配置yum源 # vim /etc/yum.repos.d/docker.repo [dockerrepo] name=Docker Repository baseurl=https:/ ...

  10. python排列组合之itertools模块

    1. 参考 几个有用的python函数 (笛卡尔积, 排列, 组合) 9.7. itertools — Functions creating iterators for efficient loopi ...