(由于对java的回调机制和线程理解的不够透彻,所以这块内容我理解了好久,尤其是绑定服务传递数据,一句一句写一句一句看,对我来说挺难理解的。以后还要多看几遍--!)

既然单纯的启动或跳转activity没有意义,那么同样的,单纯的启动或绑定service也是无意义的,实际应用中常常要携带数据启动service或绑定service。

1.启动service并传递数据

(1)新建一个Service:MyService

(2)在布局中添加两个按钮,启动服务和停止服务,和一个EditText,用户传递数据

(3)给两个按钮添加监听器,分别执行startService方法和stopService方法

(4)在MyService类中onCreate方法添加一个控制台输出语句,便于我们看到服务的状态和数据的传递效果。

(5)在开始按钮的onClick方法中添加intent.putExtra("data",etData.getText().toString()),用于在activity中初始化和传递数据。

(6)在MyService类中重写onStartCommand方法,其中的intent参数用于接收activity传来的数据。intent.getStringExtra("data");

此时运行程序,点击启动服务,会在控制台输出界面输入框中的数据,更改数据再次点击启动服务,控制台输出的数据也随之改变。点击停止服务,控制台停止输出。

代码如下:

MyService.java:

public class MyService extendsService {private boolean running = false;private String data = "这是默认信息";publicMyService() {

}

@OverridepublicIBinder onBind(Intent intent) {//TODO: Return the communication channel to the service.

throw new UnsupportedOperationException("Not yet implemented");

}

@Overridepublic int onStartCommand(Intent intent, int flags, intstartId) {

data= intent.getStringExtra("data");return super.onStartCommand(intent, flags, startId);

}

@Overridepublic voidonCreate() {super.onCreate();

running= true;newThread() {

@Overridepublic voidrun() {super.run();while(running){

System.out.println(data);try{

sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

}.start();

}

@Overridepublic voidonDestroy() {super.onDestroy();

running= false;

}

}

MainActivity.java:

importandroid.os.Bundle;importandroid.support.v7.widget.SwitchCompat;importandroid.view.View;importandroid.widget.EditText;importlayout.MyService;public class MainActivity extends AppCompatActivity implementsView.OnClickListener{privateEditText etData;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

findViewById(R.id.btnStartSevice).setOnClickListener(this);

findViewById(R.id.btnStopSevice).setOnClickListener(this);

etData=(EditText) findViewById(R.id.etData);

}

@Overridepublic voidonClick(View view) {switch(view.getId()) {caseR.id.btnStartSevice:

Intent i= new Intent(this, MyService.class);

i.putExtra("data",etData.getText().toString());

startService(i);break;caseR.id.btnStopSevice:

stopService(new Intent(this,MyService.class));break;

}

}

}

activity_main.xml:

2.绑定服务并传递数据(执行服务的内部代码)

(1)在布局中添加三个按钮,绑定服务、解除绑定服务、同步数据,同步数据按钮是用来同步activity传到service的数据。

(2)给绑定服务和解除绑定服务按钮添加监听器,执行以下代码

绑定服务:bindService(new Intent(this,MyService.class),this, Context.BIND_AUTO_CREATE);

解除绑定服务:unbindService(this);

(3)同时实现两个方法onServiceConnected()和onServiceDisconnectid();

(4)在MyService类中添加一个Binder 类,该类内添加一个成员方方法setData()用来实时更改数据。

public class Binder extendsandroid.os.Binder{public voidsetData(String data){

MyService.this.data =data;

}

}

(5)在MyService类中的onBind方法中添加return new Binder();返回上一步新建的类的一个对象作为一个activity与service绑定的纽带。

(6)回到MainActivity.java,创建一个binder:MyService.Binder binder = null;

(7)在onServiceConnected()方法中添加 binder = (MyService.Binder) iBinder;

(8)在同步数据按钮的onClick()方法中执行以下代码:

if(binder!=null){

binder.setData(etData.getText().toString());

至此完成绑定服务并传递数据。这样的用法好处是不用每次同步数据时都发送一个intent,而是直接通过调用方法来同步数据,保证了代码的高效性,也很快捷。

3.绑定服务并传递数据(侦听服务内部状态)

利用java的回调机制,从activity传递数据到service,service接到数据或数据改变时回调回来呈现在activity中

(1)在MyService类中添加一个CallBack接口,添加抽象方法onDataChange()。

(2)在MyService类中创建CallBack的对象,并添加get和set方法。

(3)在binder类中添加一个getService()方法,返回MyService.this.

(4)回到外部的MainActivity,布局添加一个TextView用于显示服务的状态。

(5)在onServiceConnected方法中添加binder.getService().setCallback(),给service添加回调函数,并且实现onDataChange方法,把数据通过Message传给Handler。

(6)在MainActivity中添加一个Handler(由于安全机制,安卓的UI线程不允许随意被调用。所以只能用Handler来改变UI),在Handler中改变TextView的值。

所有的代码如下:

MyService.java:

importandroid.app.Service;importandroid.content.Intent;importandroid.os.Binder;importandroid.os.IBinder;public class MyService extendsService {private boolean running = false;private String data = "这是默认信息";publicMyService() {

}

@OverridepublicIBinder onBind(Intent intent) {return newBinder();

}public class Binder extendsandroid.os.Binder{public voidsetData(String data){

MyService.this.data =data;

}publicMyService getService(){return MyService.this;

}

}

@Overridepublic int onStartCommand(Intent intent, int flags, intstartId) {

data= intent.getStringExtra("data");return super.onStartCommand(intent, flags, startId);

}

@Overridepublic voidonCreate() {super.onCreate();

running= true;newThread() {

@Overridepublic voidrun() {super.run();int i = 0;while(running){

i++;

String str= i+":"+data;

System.out.println(i+":"+data);if(callback!=null){

callback.onDataChange(str);

}try{

sleep(1000);

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

}.start();

}

@Overridepublic voidonDestroy() {super.onDestroy();

running= false;

}private CallBack callback = null;public voidsetCallback(CallBack callback) {this.callback =callback;

}publicCallBack getCallback() {returncallback;

}public static interfaceCallBack{voidonDataChange(String data);

}

}

activity_main.xml和MainActivity:

importandroid.content.ComponentName;importandroid.content.Context;importandroid.content.Intent;importandroid.content.ServiceConnection;importandroid.os.Handler;importandroid.os.IBinder;importandroid.os.Message;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.support.v7.widget.SwitchCompat;importandroid.view.View;importandroid.widget.EditText;importandroid.widget.TextView;importlayout.MyService;public class MainActivity extends AppCompatActivity implementsView.OnClickListener, ServiceConnection {privateEditText etData;privateTextView tvOut;private MyService.Binder binder = null;

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

etData=(EditText) findViewById(R.id.etData);

findViewById(R.id.btnStartSevice).setOnClickListener(this);

findViewById(R.id.btnStopSevice).setOnClickListener(this);

findViewById(R.id.btnBindService).setOnClickListener(this);

findViewById(R.id.btnUnbindService).setOnClickListener(this);

findViewById(R.id.btnSyncData).setOnClickListener(this);

tvOut=(TextView) findViewById(R.id.tvOut);

}

@Overridepublic voidonClick(View view) {switch(view.getId()) {caseR.id.btnStartSevice:

Intent i= new Intent(this, MyService.class);

i.putExtra("data",etData.getText().toString());

startService(i);break;caseR.id.btnStopSevice:

stopService(new Intent(this,MyService.class));break;caseR.id.btnBindService:

bindService(new Intent(this,MyService.class),this, Context.BIND_AUTO_CREATE);break;caseR.id.btnUnbindService:

unbindService(this);break;caseR.id.btnSyncData:if(binder!=null){

binder.setData(etData.getText().toString());

}break;

}

}

@Overridepublic voidonServiceConnected(ComponentName componentName, IBinder iBinder) {

binder=(MyService.Binder) iBinder;

binder.getService().setCallback(newMyService.CallBack() {

@Overridepublic voidonDataChange(String data) {

Message msg= newMessage();

Bundle b= newBundle();

b.putString("data",data);

msg.setData(b);

handler.sendMessage(msg);

}

});

}

@Overridepublic voidonServiceDisconnected(ComponentName componentName) {

}private Handler handler = newHandler(){

@Overridepublic voidhandleMessage(Message msg) {super.handleMessage(msg);

tvOut.setText(msg.getData().getString("data"));

}

};

}

安卓用于组件传递参数的对象是_入门篇:7.组件2:Android Service-service的数据传递与通信...相关推荐

  1. 安卓用于组件传递参数的对象是_[南开大学]18秋学期(1709、1803、1809)《手机应用软件设计与实现》在线作业 ......

    18秋学期(1709.1803.1809)<手机应用软件设计与实现>在线作业 一.单选题: 1.[单选题]在AndroidManifes.xml中描述一个Activity时,该Activi ...

  2. Android stutio实现Activity数据传递和回传

    实验二:Android stutio实现Activity数据传递和回传 本次实验需要两个界面来回传递 activity_main.xml文件代码: <?xml version="1.0 ...

  3. android activity之间传递对象,Android Activity之间的数据传递

    一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity,可以使用 startActivity(Intent ...

  4. 简述使用混合传递参数时的基本原则_过程控制系统与仪表习题答案 -

    6-4 过程控制系统设计包括哪些步骤? 解答:P174 (1)熟悉和理解生产对控制系统的技术要求与性能指标 (2)建立被控过程的数学模型 (3)控制方案的确定 (4)控制设备选型 (5)实验(或仿真) ...

  5. 简述使用混合传递参数时的基本原则_工程机械考试题库

    练习一 一.填空 1.装载机按使用场所不同可以分为露天用装载机和井下用装载机. 2.同一铲斗有两种容积标志,一是平装斗容,二是堆装斗容. 3.半轴的理想支承方式是全浮式支承,这种支承方式可使半轴只承受 ...

  6. python传递参数格式_Python语言学习基础篇之Python发送Post请求之根据参数位置传参、数据类型、不同方式传参...

    本文主要介绍了Python语言学习基础篇之Python发送Post请求之根据参数位置传参.数据类型.不同方式传参,通过具体的内容向大家展现,希望对大家Python语言的学习有所帮助. 目录 一.验证 ...

  7. 简述使用混合传递参数时的基本原则_东南大学传热学考试真题试卷与解析

    东大2006-2007学年第二学期期末考试 <传热学>试题(A卷)答案 一.填空题(每空1分,共20分) 1.某物体温度分布的表达式为t=f(x ,y,τ),此温度场为二维(几维).非稳态 ...

  8. 简述使用混合传递参数时的基本原则_化工原理复习资料

    <化工原理>复习资料 一.选择题 1.下列单元操作中属于动量传递的有① ①流体输送,②蒸发,③气体吸收,④结晶 2.在26 ℃和1大气压下,CO2在空气中的分子扩散系数D 等于0.164c ...

  9. Android学习笔记之数据传递

    Intent startActivity方法将调用请求发送给了ActivityManager,ActivityManager负责创建SecondActivity 显式Intent Intent构造函数 ...

最新文章

  1. Jabba: hybrid error correction for long sequencing reads using maximal exact matches机译:Jabba:使用最大精
  2. AliOS Things KV组件的写平衡特性
  3. idea自动生成类注释和方法注释
  4. 40个亿非负整数中找到未出现的数
  5. 第一章 TensorFlow基础——python语法(一)
  6. 64位linux安装mysql数据库吗_CentOS7 64位安装mysql教程
  7. 快速计算整数的二进制表示法中1的个数
  8. 用Docker搭建Elasticsearch集群
  9. jquery实现的视差滚动教程(视差大背景效果)
  10. java线程交替执行_Java synchronized线程交替运行实现过程详解
  11. RedHat as4 u2下的oracle9.2.0.4安装
  12. java实现堆栈排序_Java代码为例讲解堆的性质和基本操作以及排序方法
  13. 工具:SQL Server软件使用指南
  14. shell脚本小程序之特洛伊木马示例
  15. linux无线网卡模拟ap,在 openSUSE 上使用 create_ap 创建虚拟 WiFi 热点来方便使用 KDE Connect 连接手机...
  16. 2.线程和进程的含义和区别,进程间通信方式有哪些?
  17. python制作图表放入excel_python写入excel(xlswriter)--生成图表
  18. 计算机视觉 python 解图片数独题
  19. 傅里叶变换经滤波处理及傅里叶逆变换
  20. 软件开发人员的内功修炼之道

热门文章

  1. js后退页面不重新加载_快应用:支持加载单独JS文件的规范思考
  2. python写入二进制文件的库_python之写入二进制文件
  3. 枚举命名规范_UE4 C++基础教程 - 编码规范
  4. python编程口诀_少儿Python编程中的算术与技巧
  5. excel条形码字体_在Excel中批量生成条形码,竟如此简单!
  6. 编译libxml2-2.6.26 __open_missing_mode 错误
  7. websocket多人聊天php,php-notes/基于websocket实现多人聊天室.md at master · dd-code-site/php-notes · GitHub...
  8. docker mysql主从_使用docker 实现MySQL主从同步/读写分离
  9. 登录不上_《盗贼之海》登录不上?还在傻傻等待,快来让我教教你
  10. Oracle备份standby,Oracle 11g 利用泠备份恢复standby库