建立能与访问者相互通信的本地服务

本文关键字:服务  方法  访问者  调用  绑定  系统  启动  通信  创建 




通过startService()和stopService()启动关闭服务。适用于服务和访问这之间没有交互的情况。如果服务和访问者之间需要方法调用或者传递参数,则需要用bindService()和unbindService()方法启动关闭服务。


采用Context.bindService()方法启动服务,在服务未被创建时,系统会调用服务的onCreate()方法,接着调用onBind()方法,这个时候访问者和服务绑定在一起。如果访问者要与服务进行通信。那么,onBind()方法必须返回Ibinder。如果访问者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)如果访问者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。


示例代码:

1.MainActivity.java

<span style="font-size:18px;">package com.example.student;

import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends Activity {
	
	private EditText studentno;
	private Button button;
	private TextView resultiew;
	private IStudent iStudent;
	private ServiceConnection conn = new StudentServiceConnection();
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		studentno = (EditText)this.findViewById(R.id.studentno);
		resultiew = (TextView)this.findViewById(R.id.resultview);
		button = (Button)this.findViewById(R.id.button);
		button.setOnClickListener(new ButtonClickListener());
		Intent service = new Intent(this,StudentService.class);
		bindService(service, conn, BIND_AUTO_CREATE);
	
		
	}
	private class StudentServiceConnection implements ServiceConnection {

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			iStudent = (IStudent)service;
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			iStudent = null;
		}
		
	}
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		unbindService(conn);
		super.onDestroy();
	}
	private final class ButtonClickListener implements OnClickListener{

		@Override
		public void onClick(View arg0) {
			// TODO Auto-generated method stub
			String no = studentno.getText().toString();
			String name = iStudent.queryStudent(Integer.valueOf(no));
			resultiew.setText(name);
		}
		
	}
	

}</span>

2.IStudent.java

<span style="font-size:18px;">package com.example.student;

public interface IStudent {
	public String queryStudent(int no);
}
</span>
3.StudentService.java

<span style="font-size:18px;">package com.example.student;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class StudentService extends Service {
	private String[] name = {"张三","李四","王二"};
	private IBinder binder = new StudentBinder();
	public  String query(int no) {
		if(no>0&&no<4) {
			return name[no-1];
		}
		return null;
	}
	@Override
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		return binder;
	}
	private class StudentBinder extends Binder implements IStudent{

		@Override
		public String queryStudent(int no) {
			// TODO Auto-generated method stub
			return query(no);
		}
		
	}

}
</span>

4.activity_main.xml
<span style="font-size:18px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/studentno" />
    <EditText
        android:id="@+id/studentno"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button"/>
    <TextView
        android:id="@+id/resultview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    

</LinearLayout>
</span>
5.AndroidManifest.xml在activity节点中添加
<span style="font-size:18px;"><service android:name="com.example.student.StudentService"/></span>

6.strings.xml
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">StudentFind</string>
    <string name="action_settings">Settings</string>
    <string name="hello_world">Hello world!</string>
    <string name="studentno">学号</string>
    <string name="button">查询</string>
    

</resources>
</span>




扩展:

Android 进程间通信的几种实现方式

一、概述       由于应用程序之间不能共享内存。在不同应用程序之间交互数据(跨进程通讯),在android SDK中提供了4种用于跨进程通讯的方式。这4种方式正好对应于android系统中4种应用程序组件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨进程调用其他应用程序的Activity;Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回)......

用Python实现简单的服务器

socket接口是实际上是操作系统提供的系统调用。socket的使用并不局限于Python语言,你可以用C或者JAVA来写出同样的socket服务器,而所有语言使用socket的方式都类似(Apache就是使用C实现的服务器) Web框架就是提前写好了服务器。不能跨语言的使用框架。框架的好处在于帮你处理了一些细节,从而实现快速开发,但同时受到Python本身性能的限制。我们已经看到,许多成功的网站都是利用动态语言(比如Python, Ruby或者PHP,比如twitter和facebook)......

我的2011——一个通信设备商程序员的年度总结

从我的观察来看,通信行业和IT行业好像总是并列概念,而CSDN更倾向或更适合IT业的人分享和关注。而在我的脑海中,一直把通信放到大的IT下面的。从2006年开始知道并关注CSDN,毕业后一直从事消费电子产品开发,直到2010年中转战通信行业,一直没有停止关注CSDN。只是惭愧过去5年中从CSDN吸取的养分多,分享的经验少。今年也是我工作的第三个年头,虽然感觉平平淡淡,但觉得还是有必要总结一下,并借此养成持续分享的习惯。一年走来,冷暖自知。 一、生活上自从去年6月份从深圳回老家工作后,生......

而立之年——三线城市程序员的年终告白

30岁(2017-1987),曾经对我来说曾是个多么遥远的数字,但它正悄然的离我越来越近。古人云,三十而立,而立的意思是自立于世,多指学有所成。 在《于丹的〈论语心得〉》里,“立”是内心的的立,是内在心灵的独立,而不是十岁的无知,二十岁的愤青,三十真正追求的是心灵的自信和坚定,在你的生命里树立清楚的自省,从容不迫的生活态度,忠于自己的心灵。当我敲下于丹的解释,我的内心是颤抖的、思虑万千,久久不能释怀。刚翻看了自己13,14,15年年底的年终总结,当年的跌宕起伏的往事,感觉不过如此,甚是平淡。不知......

收获与反思——我的2016

收获与反思——我的2016         在懵懂与忐忑之中,步入职场之路,算上实习的岁月,已即将两年,说不完的风景,聊不完的苦涩,道不尽的收获。春去秋来,风雨同行,点滴记录程序员的成长,我的成长。         在经历一番系统的培训之后,我走上了工作岗位,开始跟着前辈做项目,短小而精悍的项目素材陪伴了我的成长。从分布式架构到微服务,从Docker容器化发布到容器化监控,从数据库设计到Linux......

ASP.Net 4.0 --- 数据访问(三)

数据访问ADO.Net访问      ASP.NET提供了ADO.NET技术,它是ASP.NET应用程序与数据库进行交互的一种技术。ADO.NET提供了对关系数据、XML和应用程序数据的访问,是.NET Framework 不可缺少的一部分。ADO.NET支持多种开发需求,把对数据库的操作分着几个步骤,并为每个步骤提供对象来封装操作过程,从而使对数据库的操作变得简单易行。      &n......

github不能访问、加载css、js解决办法

表现症状页面加载慢,并且页面样式明显错乱。原因极有可能是github的DNS被GFW污染了。https://github.global.ssl.fastly.net/assets/github-4aa98817ea815bcd147016e4d001b 8db4b0a048a.csshttps://github.global.ssl.fastly.net/assets/github-4aa98817ea815bcd14704olkw001b 121db0a048a.jsgithub之前将CDN切......

那些支持我学习与工作的良师益友

      2011大学毕业后,成为一名JAVA开发人员从事开发工作只有区区3年不到的时间。回想高中时,学校计算机课开设Flash课程,第一次接触Flash的我,便对计算机技术产生了浓厚的兴趣,后来还参加市里FLASH动画制作比赛,拿了三等奖。     说来可惜,由于家里反对,大学时并没有进入计算机专业。但处于对编程的热爱,从大学开始就一直在自己学习,从DOS命令一直到C。大学毕业后,开始参加JAVA培训,在这里与大家分享下学习java......

MPI,openMP与pthread的基本demo

MPI demo编译命令:mpicc -g -Wall -o Hello_mpi Hello_mpi.c执行命令:mpiexec -n 16 ./Hello_mpi#include <stdio.h>#include <string.h>#include <mpi.h>const int MAX_STRING = 100;int main(){ char greeting[MAX_STRING]; int comm_sz; int my_ra......

CPU的基本知识与使用方法

1,CPU的两大巨头Intel,使用CISC(复杂指令集,只是用20%),主要占领服务器,PC端市场。ARM,使用RISC(精简指令集),主要占领嵌入式市场。2,冯.洛伊曼架构和哈佛架构。冯.洛伊曼架构:以运算单元为中心采用存储程序原理存储器是按地址访问、线性编址的空间控制流由指令流产生指令由操作码和地址码组成数据以二进制编码哈佛架构:存储与指令分开,也就存储使用8bit,指令为14bit,分别为两块存储空间,所以在取指令与取数据时不会在总线上发生冲突。现代PC都是伪.冯.洛伊曼结构,在CPU外......

我的2016-我与android的故事

入坑android,从2015年1月末至今,也是一年光阴。期间经历的总总,似乎学到了很多,但似乎,又觉得欠缺了什么。对于一个非科班出身,周围也没有多少从事IT行业的人来说。你学到了什么地步,能做什么工作,能力如何,都是一个未知数。于是总是害怕自己学得不够好,能力不够,于是碰上些什么其他的新名词,就会觉得,哇喔,看不懂,我学得还不够。于是,默默度娘各种关于android的知识,也慢慢地把一些曾经觉得要不可及的知识点,变成自己的东西。但就如bug一样,你学完了这一个知识,却不知道原来还有更多的bug......

2016年点亮的新技能树——指导·招聘·业务

2015年入职的公司刚倒闭,一家公司招我进去带俩新人做项目,我刚来了没半个月他俩都跑了。我成了2016年春夏之交的CSDN首页上“到新公司带新人,新人跑了”的笑话。这个故事是有续集的,他俩跑了以后我这个“软件技术总负责人”就成了光杆司令,当时恰好是三老板生日,大老板说要请我们去海上小鲜大酒店(四层楼高,听名字猜价格)吃饭。前桌吃的是波士顿龙虾,后桌吃的是鳄鱼龟,左桌吃的是三文鱼刺身,右桌吃的是阿拉斯加蟹腿,我们五个人(三个老板一个员工一个客人)吃什么就不说了,反正五个人花了200元......

Mac下使用自带终端SSH功能的一个小技巧

在Mac OS的终端(terminal)中,可以使用命令ssh user@host的命令来远程连接一台服务器,但是,如果要管理的服务器太多,IP地址不能全部记住的时候怎么办?这时候我们可以为每一台服务器设置一个别名(alias),使用vi命令编辑一下~/.ssh/config这个文件(如果目录下没有这个文件,可以新建一个),接着按下面格式添加内容:# 服务器1Host 别名 HostName IP地址 Port 22 User 用户名# 服务器2Host 别名 HostN......

javaWeb中文件的上传与下载及乱码问题解决

前端代码:<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>文件上传页面</title> </head> <body> <f......

[Python]使用TuShare能获取到哪些信息?

windows下先前装了Anaconda3,然后用pip 直接装tushare即可。测试tushare, 试试票房数据先再看我们公司股票也可以设定历史数据的起始时间:ts.get_hist_data('600848',start='2015-01-05',end='2015-01-09')其他:ts.get_hist_data('600848', ktype='W') #获取周k线数据ts.get_hist_data('600848', ktype='M') #获取月k线数据ts.get_his......

并行计算起源与基本概念

1.并行计算硬件出现2002年以前,芯片上的晶体管集成密度指数上升,性能保持1.5倍增长,但是渐渐的随着晶体管密度上升,空气散热已经无法解决散热问题,芯片制造商提出与其制造单块计算性能更快的芯片不如在单块芯片上面集成更多的计算核心,由此出现多个CPU的芯片---多核。上图为典型的计算机系统硬件结构图,主要看CPU(Central Processing Unit)部分,由PC(程序计数器),寄存器文件,ALU(计算逻辑单元),总线结构组成(Bus interface)组成,多核即可看成是有多个CP......

hexo+gitHub搭建个人独立博客(一)

最新资讯谷歌的一篇文章则着重说明了新成立的指导小组将如何“让MDN成为最好的Web参考文档,帮助我们更好地进行Web开发”。指导小组目前的成员包括微软、谷歌、Mozilla、三星和W3C。值得注意的是,苹果公司并没有参与这次发布声明。前言一直想要一个自己的独立博客,域名跟服务器到现在快买有一年了,由于种种原因最终还是没有搭建自己的博客,服务器差不多放一年了,快要发霉了。去逛gitHub时候发现好多人的项目里都有**.github.io慢慢研究,就偶然的发现Hexo这个优秀的静态博客框架,再搭配现......

新建一个Vue项目需要做的

1. 建立一个Vue项目vue init webpack appname2. 设置编译结果目录a. 修改/config/index下的exports.build.index值为主html文件的路径。 b. 修改/config/index下的exports.build.assetsRoot值为静态资源文件夹的路径(一般为项目的public目录)。 c. 修改/config/index下的exports.build.assetsSubDictionary值为静态资源文件夹下子目录名。3*. 关闭产品......

hashCode与equals的区别与联系

一、equals方法的作用   1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。2 、要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。没有覆盖equals方法代码如下:[java] view plain copy/......

linux的crontab定时服务备份mysql数据

利用Linux的crontab定时服务备份mysql数据。一、库文件备份库文件备份,我建议一周一次(当然,我的项目规模一般,然后至于怎么一周一次,稍候我们再聊了)#!/bin/bashdate_now=`date +%Y_%m_%d_%H%M%S`mysqldump -uroot -plixiaoli --flush-logs --master-data=2 maweiqing>/home/backup/${date_now}.sql &&zip -r /home/back......