• service bound()


    Service bound 一

    service 绑定有三种实现方式:

    1. 直接继承Binder类实现。

          条件: 同一应用,同一进程

    2. 使用Messenger实现。

          条件:要在不同的进程间通信,这种方式不用考虑线程安全性。(单线程操作时使用)

    3. 使用AIDL实现。

          条件:要在不同的进程间通信,并且需要多线程处理。要考虑线程之间的安全性。


    下面是继承Binder类实现的例子;

    具体步骤:

    • 在service中创建Binder实例
    • onBind() 返回Binder实例
    • 在client,实现ConnectionService类,获取Binder 对象。


    ---创建在service中创建Binder实例

    	private LocalBinderExample binder = new LocalBinderExample();
    	
    	/**
    	 * 其他组件绑定service的时候会返回Binder实例
    	 */
    	@Override
    	public IBinder onBind(Intent intent) {
    		return binder;
    	}
    	
    	public class LocalBinderExample extends Binder{
    		
    		public LocalServiceExample getService(){
    			return LocalServiceExample.this ; //返回service
    		}
    		
    	}


    service有定义一个共有方法,为了在其他组件中调用。

    	
    	/**
    	 * 其他的组件通过service可以调用
    	 */
    	public String getServiceName(){
    		return LocalServiceExample.this.getClass().getName() ;
    	}
    	


    --- onBind() 返回Binder实例

    @Override
    	public IBinder onBind(Intent intent) {
    		return binder;
    	}

    ---在client,实现ConnectionService类,获取Binder 对象。

    package com.hualu.serviceexample.bindinsampleapplicationprocesses;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.IBinder;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;
    
    import com.hualu.serviceexample.R;
    import com.hualu.serviceexample.bindinsampleapplicationprocesses.LocalServiceExample.LocalBinderExample;
    
    public class LocalServiceExampleActivity extends Activity implements OnClickListener{
    
    	private Button bound ;
    	private TextView text ;
    	private LocalServiceExample mService ;
    	
    	private boolean bBound = false ;
    	
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.layout_binder_same_application_processes) ;
    		bound = (Button)this.findViewById(R.id.bound) ;
    		text = (TextView)this.findViewById(R.id.text) ;
    		bound.setOnClickListener(this) ;
    		
    	}
    	@Override
    	public void onClick(View v) {
    		switch (v.getId()) {
    		case R.id.bound:
    			bindService(new Intent("com.hualu.serviceexample.BIND_SAME_APPLICATION_PROCESSES_SERVICE"), conn, Context.BIND_AUTO_CREATE) ; //绑定service
    			new Handler().postDelayed(new Runnable() {
    				@Override
    				public void run() {
    					if(mService != null){
    						text.setText(mService.getServiceName()) ;
    					}
    				}
    			}, 1000) ;
    			
    			break;
    
    		default:
    			break;
    		}
    	}
    	
    	private ServiceConnection  conn = new ServiceConnection() {
    		
    		@Override
    		public void onServiceDisconnected(ComponentName name) {
    			bBound = false ;
    		}
    		
    		@Override
    		public void onServiceConnected(ComponentName name, IBinder service) {
    			LocalBinderExample binder = (LocalBinderExample)service ;
    			mService = binder.getService() ;
    			bBound = true ;
    		}
    	};
    	
    	
    	protected void onStop() {
    		super.onPause() ;
    		if(bBound){
    			unbindService(conn) ;
    		}
    	};
    }
    


    service的全部代码

    package com.hualu.serviceexample.bindinsampleapplicationprocesses;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    
    /**
     * @author Administrator
     *
     */
    
    public class LocalServiceExample extends Service {
    
    	private LocalBinderExample binder = new LocalBinderExample();
    	
    	/**
    	 * 其他组件绑定service的时候会返回Binder实例
    	 */
    	@Override
    	public IBinder onBind(Intent intent) {
    		return binder;
    	}
    	
    	public class LocalBinderExample extends Binder{
    		
    		public LocalServiceExample getService(){
    			return LocalServiceExample.this ; //返回service
    		}
    		
    	}
    	
    	/**
    	 * 其他的组件通过service可以调用
    	 */
    	public String getServiceName(){
    		return LocalServiceExample.this.getClass().getName() ;
    	}
    	
    
    }
    

    Layout文件的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="" />
    
        <Button
            android:id="@+id/bound"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@+id/text"
            android:text="@string/bound" />
    	
    </RelativeLayout>


    manifest中关于activity和service的声明:

    <activity android:name=".bindinsampleapplicationprocesses.LocalServiceExampleActivity">
           		<intent-filter>
           		    <action android:name="com.hualu.serviceexample.BIND_SAME_APPLICATION_PROCESSES"></action>
           		    <category android:name="android.intent.category.DEFAULT"></category>
           		</intent-filter>
            </activity>
            <service android:name=".bindinsampleapplicationprocesses.LocalServiceExample">
                <intent-filter>
                    <action android:name="com.hualu.serviceexample.BIND_SAME_APPLICATION_PROCESSES_SERVICE"></action>
                </intent-filter>
            </service>





  • 相关阅读:
    【已解决】Android ADT中增大AVD内存后无法启动:emulator failed to allocate memory
    XE10 塔建 Android 开发环境 (已测试通过)
    Erstudio8.0怎么用?Erstudio8.0汉化版详细使用教程
    Excel 信息对比_数组版
    百万级数据查询优化(数据库)
    sql查询重复记录、删除重复记录方法大全
    JS和JSON的区别
    JS中字符串的true转化为boolean类型的true
    关于HTTP协议,一篇就够了
    关于JS的prototype
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3002601.html
Copyright © 2020-2023  润新知