服务(Service)全解析(二)--bindService

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: MainActivity如下: package cc.testservice2;import android.app.Activity;import android.

MainActivity如下:

package cc.testservice2;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
/**
 * Demo描述:
 * 采用bindService()方法启动服务
 * 该Demo描述的本地服务,即服务和访问者在同一进程
 * 
 * 客户端总结:
 * 客户端(此处为MainActivity)的核心目的:
 * 得到服务返回来的Binder对象,然后利用此Binder对象调用服务里的相关方法
 * 
 * 详细步骤:
 * 1 写一个ServiceConnectionImpl类实现了ServiceConnection接口
 *   即 private final class ServiceConnectionImpl implements ServiceConnection
 * 2 新建ServiceConnectionImpl类的对象conn.然后利用Context激活服务,与服务建立连接
 *   即 this.bindService(service, conn, this.BIND_AUTO_CREATE);
 * 3 覆写ServiceConnectionImpl类的public void onServiceConnected(ComponentName name, IBinder service)
 *   方法,该为一个回调方法!!!!当客户端与服务建立连接后,服务端的public IBinder onBind(Intent intent)()方法
 *   就会返回一个IBinder对象给客服端.此IBinder对象就是方法
 *   public void onServiceConnected(ComponentName name,IBinder service)中的service 
 * 4 利用服务器返回的IBinder对象调用服务中的方法
 *  
 * 注意:
 * 1 在绑定和解除绑定用的都是从mServiceConnectionImpl对象,它的类实现了ServiceConnection接口
 * 2 注意不但要重写MainActivity的onCreate()里与服务建立连接,而且还要重写Activity的 onDestroy()方法!
 *    以便在此Activity退出时,关闭与服务的连接
 * 3 在这个小应用中为什么要定义一个接口呢?
 *   因为服务要返回给MainActivity一个Binder对象,MainActivity接收此对象。此对象是在服务里内部类的对象。
 *   但是一般来说内部类是私有的。所以在MainActivity里不可能new()一个内部类对象来接收此对象
 *   所以在此定义了接口--->用接口来接收Binder对象.这样做而且很规范,将业务抽象成接口.
 *   
 * 服务端总结:
 * 1 自定义服务类ServiceSubclass继承自Service
 * 2 写一个自定义的内部类BinderSubclass实现了业务接口,且继承自Binder
 * 3 重写Service的public IBinder onBind(Intent intent)方法,返回一个IBinder对象.
 *   即这里的BinderSubclass类对象
 */
public class MainActivity extends Activity {
    TextView mNumberTextView;
    TextView mResultTextView;
    Button mSearchButton;  
    ServiceConnectionImpl mServiceConnectionImpl;
    QueryInterface  mBinder; 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //用于接收服务返回的Binder对象
        mServiceConnectionImpl=new ServiceConnectionImpl();
        mNumberTextView=(TextView) findViewById(R.id.numberEditText);
        mResultTextView=(TextView) findViewById(R.id.resultTextView);
        mSearchButton=(Button) findViewById(R.id.searchButton);
        mSearchButton.setOnClickListener(new ButtonOnClickListener());
        Intent intent=new Intent(this,ServiceSubclass.class);
        //当Activity启动的时候就启动服务
        bindService(intent, mServiceConnectionImpl, this.BIND_AUTO_CREATE);
    }
    
    private class ButtonOnClickListener implements OnClickListener{
		public void onClick(View v) {			
			String number=mNumberTextView.getText().toString();
			String result=mBinder.queryByNumber(Integer.valueOf(number));
			mResultTextView.setText(result);
		}   	
    }
    
    //绑定服务和解除服务
    private final class ServiceConnectionImpl implements ServiceConnection{
    	//绑定服务时,此方法调用
		public void onServiceConnected(ComponentName name, IBinder service) {
			 mBinder=(QueryInterface) service;			
		}
		//解除服务时,此方法调用
		public void onServiceDisconnected(ComponentName name) {
			mBinder=null;
		}   	
    }
    
   //解除与服务的连接
	protected void onDestroy() {
		unbindService(mServiceConnectionImpl);
		super.onDestroy();	
	}
   
    
}


ServiceSubclass如下:

package cc.testservice2;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
/**
* 服务端总结:
* 1 自定义服务类ServiceSubclass继承自Service
* 2 写一个自定义的内部类BinderSubclass实现了业务接口,且继承自Binder
* 3 重写Service的public IBinder onBind(Intent intent)方法,返回一个IBinder对象.
*   即这里的BinderSubclass类对象
*/
public class ServiceSubclass extends Service {
	private String[] names = new String[] { "小明", "小王", "小杨", "小李", "小强" };
	BinderSubclass mBinderSubclass = new BinderSubclass();
	
	@Override
	public IBinder onBind(Intent intent) {
		return mBinderSubclass;
	}
	// queryByNumber就是接口里的业务方法.
	//一般来讲将业务抽象为一个接口,然后去实现接口,比如此处。
	// 注意:BinderSubclass继承自Binder也实现了业务接口
	private final class BinderSubclass extends Binder implements QueryInterface {
		public String queryByNumber(int number) {
			return query(number);
		}
	}

	//服务内部的方法
	public String query(int i) {
		if (i > 0 && i < 6) {
			return names[i - 1];
		}
		return "查询错误,请再次输入";
	}

}


QueryInterface如下:

package cc.testservice2;
//业务接口
public interface QueryInterface {
   public String queryByNumber(int number);
}


main.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="请输入1到5的数字" />

    <EditText
        android:id="@+id/numberEditText"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    <Button
        android:id="@+id/searchButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询" />

    <TextView
        android:id="@+id/resultTextView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>


 

相关文章
|
22天前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
53 3
|
5天前
|
域名解析 缓存 网络协议
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
浏览器中输入URL返回页面过程(超级详细)、DNS域名解析服务,TCP三次握手、四次挥手
|
6天前
|
安全 测试技术 数据安全/隐私保护
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
原生鸿蒙应用市场开发者服务的技术解析:从集成到应用发布的完整体验
|
2月前
|
自然语言处理 数据可视化 BI
文档解析(大模型版)服务体验评测
体验文档解析(大模型版)服务时,清晰的入门指南、操作手册和FAQ至关重要。若存在不足,需增加直观的操作流程说明(如动画演示)、深化高级功能文档,并提供实时在线支持,帮助用户快速解决问题。
|
25天前
|
网络安全 Docker 容器
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
【Bug修复】秒杀服务器异常,轻松恢复网站访问--从防火墙到Docker服务的全面解析
19 0
|
2月前
|
弹性计算 自然语言处理 数据可视化
|
1月前
|
存储 缓存 网络协议
搭建dns服务常见报错--查看/etc/named.conf没有错误日志信息却显示出错(/etc/named.conf:49: missing ‘;‘ before ‘include‘)及dns介绍
搭建dns服务常见报错--查看/etc/named.conf没有错误日志信息却显示出错(/etc/named.conf:49: missing ‘;‘ before ‘include‘)及dns介绍
|
2月前
|
存储 消息中间件 算法
深入解析OpenStack Cinder:块存储服务详解
本文介绍了OpenStack及其块存储服务Cinder。OpenStack是一个开源云计算管理平台,提供基础设施即服务(IaaS),核心服务包括计算、网络、存储等。Cinder主要用于为虚拟机提供持久性块存储,具备多种功能,如卷操作、备份、快照及与实例的交互等。此外,还详细介绍了Cinder的工作流程、命令行操作及不同存储插件的使用。
327 8
|
2月前
|
域名解析 网络协议
DNS服务工作原理
文章详细介绍了DNS服务的工作原理,包括FQDN的概念、名称解析过程、DNS域名分级策略、根服务器的作用、DNS解析流程中的递归查询和迭代查询,以及为何有时基于IP能访问而基于域名不能访问的原因。
192 2
|
3月前
|
Java 缓存 数据库连接
揭秘!Struts 2性能翻倍的秘诀:不可思议的优化技巧大公开
【8月更文挑战第31天】《Struts 2性能优化技巧》介绍了提升Struts 2 Web应用响应速度的关键策略,包括减少配置开销、优化Action处理、合理使用拦截器、精简标签库使用、改进数据访问方式、利用缓存机制以及浏览器与网络层面的优化。通过实施这些技巧,如懒加载配置、异步请求处理、高效数据库连接管理和启用GZIP压缩等,可显著提高应用性能,为用户提供更快的体验。性能优化需根据实际场景持续调整。
70 0

热门文章

最新文章

推荐镜像

更多