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

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>

 

时间: 2024-08-01 11:50:57

服务(Service)全解析(二)--bindService的相关文章

服务(Service)全解析(六)--避免被系统回收的Service

MainActivity如下: package cc.c; import java.util.List; import android.os.Bundle; import android.os.Process; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import android.ap

服务(Service)全解析(五)--前台Service

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.v

服务(Service)全解析(一)--startService

MainActivity如下: package cn.testservice1; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.app.Activity; import android.content.Intent; /** * Demo描述: * 采用startSe

服务(Service)全解析(三)--IntentService

MainActivity如下: package cc.testservice3; import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /** * Demo描述: * IntentSer

SaaS软件服务优点全解析

本文讲的是SaaS软件服务优点全解析,[IT168 资讯]随着SOA.联合身份管理技术(Federated Identity Management)以及托管集成技术的发展,IT资源的物理位置会变得越来越不重要,Internet基础设施正使企业内外的界面模糊起来.对企业来说,如何使软件与硬件技术的发展更快速.方便地应用于企业,快速实现企业不断变化的业务流程,快速集成与展现不同来源的业务数据,成为了当前企业应用IT技术需要考虑的问题.以往那种从新购买软件硬件,从头建设的方式,从需求分析.选型.设计.

一扫天下——ZXing使用全解析

一扫天下--ZXing使用全解析 二维码现在已经烂App了,不管什么App,没有二维码就好像低人一等了.所以,在自己的项目中集成二维码功能还是非常有必要的. 网上很多都是基于ZXing2.3的,但是现在都3.1了,改了很多bug,也进行了很多优化,最好按本文弄一下. 参拜ZXing ZXing的github地址: https://github.com/zxing/zxing 通过git clone git@github.com:zxing/zxing.git 命令我们可以把整个ZXing项目拉取

Android异步加载全解析之IntentService

Android异步加载全解析之IntentService 搞什么IntentService 前面我们说了那么多,异步处理都使用钦定的AsyncTask,再不济也使用的Thread,那么这个IntentService是个什么鬼. 相对与前面我们提到的这两种异步加载的方式来说,IntentService有一个最大的特点,就是--IntentService不受大部分UI生命周期的影响,它为后台线程提供了一个更直接的操作方式.不过,IntentService的不足主要体现在以下几点: 不可以直接和UI做

CSS 中z-index全解析

z-index全解析 Z-index属性决定了一个HTML元素的层叠级别. 元素层叠级别是相对于元素在Z轴上(与X轴Y轴相对照)的位置而言. 一个更高的Z-index值意味着这个元素在叠层顺序中会更靠近顶部.这个层叠顺序沿着垂直的线轴被呈现. 在一个HTML页面中,自然的层叠顺序(也就是元素在Z轴上的顺序)是由很多因素决定的: 具有负值的stacking contexts(层叠环境)元素,按照出现的先后顺序排列(越靠后层级越靠上); 没有被定位,没有浮动的块级元素,按照出现的先后顺序排列; 没有

ASP.NET缓存全解析6:数据库缓存依赖

ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓存 ASP.NET 缓存全解析5:文件缓存依赖 ASP.NET 缓存全解析6:数据库缓存依赖 ASP.NET 缓存全解析7:第三方分布式缓存解决方案 Memcached和Cacheman 更多的时候,我们的服务器性能损耗还是在查询数据库的时候,所以对数据库的缓存还是显得特别重要,上面几种方式都可以实