• Android编程心得-Service数据绑定初步


    在Android里,Service的数据绑定是一种重要的用法,我们知道Service与Activity一样是运行在当前应用进程的主线程里面的,他们之间交互的方式有多种,下面我来介绍一下如何使用数据绑定的方法通过Service向Activity交互数据


    1.首先我们要定义一个接口,接口里定义我们需要实现的方法

    public interface ICount {
    			public int getcount();
    			
    }

    2.接下来我们需要一个Service的子类实现本接口,定义一个ServiceBinder的内部类,通过它的对象来绑定数据,要注意的是我们如果要进行耗时操作的话,仍然需要在Service中创建线程,Service自身就是运行在主线程中的。还有一个就是OnBind的返回值是IBinder,但是这里我使用ServiceBinder对象是继承Binder的,那为什么这里可以这么写呢?因为Binder是Base class for a remotable object, the core part of a lightweight remote procedure call mechanism defined by IBinder,是直接从IBinder这里的直接子类

    public class BackGroundService extends Service implements ICount {
    	private boolean disable;  //线程是否执行的标识位
    	private int count;      //计数
    	private ServiceBinder serviceBinder = new ServiceBinder();
    	
    	public class ServiceBinder extends Binder implements ICount {
    		@Override
    		public int getcount() {
    			// TODO Auto-generated method stub
    			return 0;
    		}
    		}
    	
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		return serviceBinder;
    	}
    	
    
    	@Override
    	public void onCreate() {
    		// TODO Auto-generated method stub
    		super.onCreate();
    		new Thread(new Runnable() {
    			// @Override
    			public void run() {
    			while (!disable) {
    			try {
    			Thread.sleep(1000);
    			} catch (InterruptedException e) {
    			}
    			count++;
    			System.out.println("CountService Count is " + count);
    			}
    			}
    			}).start();
    	}
    
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {
    		// TODO Auto-generated method stub
    
    		return super.onStartCommand(intent, flags, startId);
    	}
    
    	@Override
    	public int getcount() {
    		return count;
    		// TODO Auto-generated method stub
    		
    	}
    
    
    
    
    	
    	@Override
    	public void onDestroy() {
    		// TODO Auto-generated method stub
    		this.disable = true;
    //		Log.v(" CountService ", " on destroy ");
    		System.out.println("Service destroy...");
    		super.onDestroy();
    	}
    
    }


    3.定义完了Service这一部分的内容,接下来就需要在AndroidManifest.xml中注册了,需要注意的是这里不仅要对我们包类的Service进行声明,同时还需要声明intent的过滤器

            <service android:name="com.yqc.testservice.BackGroundService">
                <intent-filter>
                    <action android:name="com.yqc.testservice.BackGroundService" />
                </intent-filter>
            </service>


    4.定义完毕以后,接下来需要在Activity中的交互部分了,刚才在配置文件中定义的Intent的过滤器这里就用到了,在bindService方法中,这就是他的一个参数,然后通过ServiceConnetion的对象与Service建立连接并取得后台的参数。

    public class MainActivity extends Activity {
    
    	Button btn_start;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		this.bindService(new Intent("com.yqc.testservice.BackGroundService"),
    				this.serviceConnection, BIND_AUTO_CREATE);
    
    		btn_start = (Button) findViewById(R.id.btn_start);
    		btn_start.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// TODO Auto-generated method stub
    
    			}
    		});
    	}
    
    
    	@Override
    	protected void onDestroy() {
    		// TODO Auto-generated method stub
    		this.unbindService(serviceConnection);
    		System.out.println("Activity Destroy...");
    		super.onDestroy();
    	}
    
    	private ICount countentity;
    
    	private ServiceConnection serviceConnection = new ServiceConnection() {
    		@Override
    		public void onServiceConnected(ComponentName name, IBinder service) {
    			// TODO Auto-generated method stub
    			countentity = (ICount) service;
    			System.out.println(" CountService on serivce connected, count is "
    					+ countentity.getcount());
    		}
    
    		@Override
    		public void onServiceDisconnected(ComponentName name) {
    			// TODO Auto-generated method stub
    			countentity = null;
    		}
    	};
    }
    

    5.最后得到的结果如下





  • 相关阅读:
    Springboot vue 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro权限
    mybatis3批量更新 批量插入
    Java GC的工作原理详解
    Hadoop的Map侧join
    cut 命令
    head 与 tail
    常用正则
    vim 设置
    Java泛型初探
    linux修改PS1,自定义命令提示符样式
  • 原文地址:https://www.cnblogs.com/riskyer/p/3292198.html
Copyright © 2020-2023  润新知