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

(由于对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"));

}

};

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/440896.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【牛客 - 330G】Applese 的毒气炸弹(最小生成树,构造,判连通图)

题干: 众所周知,Applese 是个很强的选手,它的化学一定很好。 今天他又AK了一套题觉得很无聊,于是想做个毒气炸弹玩。 毒气炸弹需要 k 种不同类型元素构成,Applese一共有 n 瓶含有这些元素的试剂。 已知元素混合遵循…

服务器风扇一直高速转系统起不来,【案例】别克君越风扇启动后一直高速常转 维修案例...

故障诊断启动车辆,冷车时风扇正常,当温度达到正常温度后,节温器打开风扇一直常转,客户描述的问题存在。目测检查发动机外观状态:无漏油、无移位、部件连接无松动、电气插头安装牢固、无异味、无过热现象,都…

添加一列_Joom平台CSV文件如何添加产品?CSV文件添加产品流程一览

CSV文件添加产品在添加产品及变型以前,请先了解产品的CSV文件介绍以及产品变型要求。CSV添加产品CSV文件中的一行对应一个产品变型。卖家想为产品添加变型的话,需要在表格里新添一行或多行信息。——列表第一行是产品基本信息及产品本身的信息。卖家需要…

【牛客 -330E 】Applese 涂颜色(费马小定理,超级快速幂)

题干: 精通程序设计的 Applese 叕写了一个游戏。 在这个游戏中,有一个 n 行 m 列的方阵。现在它要为这个方阵涂上黑白两种颜色。规定左右相邻两格的颜色不能相同。请你帮它统计一下有多少种涂色的方法。由于答案很大,你需要将答案对 10971…

四元数乘法_JPL四元数和Hamilton四元数的区别

四元数的定义: 1.顺序JPL: 实部在后 , Hamilton: 实部在前 , 2.坐标系JPL: 左手坐标系 Hamilton: 右手坐标系 3.坐标系的转换方向JPL: global-to-local 世界坐标系 --> 局部坐标系 , Hamilton: local-to-global 局部坐标系 --> 世界坐标系 , 4.四元数与旋…

【牛客 - 330I】Applese 的回文串(结论题,类似编辑距离,dp)

题干: 自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串。 这样的题目未免让它觉得太无聊,于是它想到了一个新的问题。 如何判断一个字符串在任意位置(包括最前面和最后面)插入一个字符后…

【POJ - 2752】Seek the Name, Seek the Fame (KMP,公共前缀后缀长度及个数)

题干: The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names to their newly-born babies. They seek the name, and at the same time seek the fame. In order to escape from such b…

编码方式_【每日一题】| 常见的编码方式之栅栏密码

CTF_密码学栅栏密码点击上方蓝字 发现更多精彩01简介栅栏密码(Rail-fence Cipher)就是把要加密的明文分成N个字一组,然后把每组的第1个字符组合,每组第2个字符组合…每组的第N(最后一个分组可能不足N个)个字符组合,最后把他们全部连接起来就是…

edp和edt哪个好_香水edp和edt是什么意思

香水adp和edt代表的是浓香水和淡香水,它们标识香水的持久度和浓度。每款香水都会给出这些相对应的参数。这些也代表的是水、酒精以及精油的比例。香水edp和edt是什么意思edp、edt以及parfum代表的都是香水的参数,edp和edt香水的浓度要稍微低一点&#xf…

【HDU - 3746 】Cyclic Nacklace (KMP,最小循环节问题)

题干: CC always becomes very depressed at the end of this month, he has checked his credit card yesterday, without any surprise, there are only 99.9 yuan left. he is too distressed and thinking about how to tide over the last days. Being inspir…

【POJ - 1961】Period(KMP,循环节问题)

题干&#xff1a; For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the prefix is a periodic string. That is, for each i (2 < i < N) we want to know the lar…

linux tomcat守护_linux下非root用户运行tomcat

# 前言&#xff1a;为什么要使用非root用户运行tomcatroot用户启动tomcat有一个严重的问题&#xff0c;那就是tomcat具有root权限。这意味着你的任何一个页面脚本(html/js)都具有root权限&#xff0c;所以可以轻易地用页面脚本 修改整个硬盘里的文件&#xff01;所以最好不要使…

【牛客 - 331E】炫酷划线(权值线段树,树状数组哈希,随机数)

题干&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/331/E 来源&#xff1a;牛客网 平面上有一个圆&#xff0c;圆环上按顺时针顺序分布着从1到n&#xff0c;一共n个点。 现在无聊的小希开始按某种顺序对其在圆内两两连线&#xff0c;小希尽量避免让两…

linux 判断网卡是否异常_如何判断linux网卡故障?

linux网卡的信息里错误和碰撞数值高是否说明网卡有问题还是网络有问题&#xff1f;如何判断网卡有没有问题&#xff1f;ifconfigeth0Linkencap:EthernetHWaddr52:51:AB:14:60:B8inetaddr:192.168.1.254Bcas...linux网卡的信息里错误和碰撞数值高是否说明网卡有问题还是网络有问…

autosar网络管理_AP AUTOSAR平台设计(11)——网络管理

点击蓝字右上角 关注置顶不迷路Hello&#xff01;大家好&#xff01;欢迎来到《搞一下汽车电子》本篇是AP AUTOSAR平台设计(11)——网络管理如果觉得不错&#xff0c;“转发” “ 在看”支持一下吧~1.网络管理算法概述AUTOSAR NM基于分散的网络管理策略&#xff0c;这意味…

【牛客 - 331D】炫酷路途(二进制枚举 或 建图方式+最短路 或 dfs)

题干&#xff1a; 小希现在要从寝室赶到机房&#xff0c;路途可以按距离分为N段&#xff0c;第i个和i1个是直接相连的&#xff0c;只需要一秒钟就可以相互到达。 炫酷的是&#xff0c;从第i个到第i2pi2p个也是直接相连的&#xff08;其中p为任意非负整数&#xff09;&#x…

mysql 子查询 as_mysql子查询

更多关于LeetCode习题总结请翻阅我的博客&#xff1a;LeetCode - mysql子查询【184. 部门工资最高的员工】子查询一、按查询结果分类&#xff1a;1.作为数据源使用&#xff1b;2.作为选择条件使用&#xff1b;二、按常见的子查询分类&#xff1a;1.由比较运算符引发的子查询&am…

【牛客 - 331G】炫酷数字(反素数打表 或 扩展埃式筛法,结论)

题干&#xff1a; 小希希望你构造一个最小的正整数&#xff0c;使得其有n个因子。 输入描述: 第一行一个整数T表示数据组数每组数据第一行输入一个正整数n&#xff0c;表示其因子数。n≤1,000,000n≤1,000,000T≤1,000,000T≤1,000,000输出描述: 输出一行一个整数&#xff…

【牛客 - 331J】炫酷数学(打表猜结论,按位枚举证明)

题干&#xff1a; 小希最近想知道一个东西&#xff0c;就是ABA|B(其中|为按位或)的二元组有多少个。 当然&#xff0c;直接做这个式子对小希来说太难了&#xff0c;所以小希改变了一些条件&#xff0c;她仅想知道其中A,B<NA,B<N的情况&#xff0c;其中N为2的幂次。 当然…

workerman mysql_workerman/mysql

Workerman/MySQL说明常驻内存的程序在使用mysql时经常会遇到mysql gone away的错误&#xff0c;这个是由于程序与mysql的连接长时间没有通讯&#xff0c;连接被mysql服务端踢掉导致。本数据库类可以解决这个问题&#xff0c;当发生mysql gone away错误时&#xff0c;会自动重试…