zoukankan      html  css  js  c++  java
  • 绑定服务时什么时候调用onRebind

    Serivce中onRebind被调用的时机非常特别,想知道什么时候onRebind被调用,能够接以下的次序来学习。最后自然就明确了!

    1. 首先要知道。同一个服务既可能被启动也能够被绑定;

    2. Service中onRebind方法被调用。仅仅要符合两个必要条件即可

        (1)服务中onUnBind方法返回值为true

        (2)服务对象被解绑后没有被销毁。之后再次被绑定

    。以下举例说明:

        例1:同一个Activity对象

        先自启动服务(onCreate, onStartCommand);再绑定服务(onBind); 再解除绑定服务(onUnBind)(因为服务被启动过,所以Service中onDestroy不会被调用);再绑定服务, 这次绑定的服务对象是之前已经创建好的,所以这次绑定服务时就会调用onReBind方法了。而且本次不会调用onBind方法。

       例2:不是同一个Activity对象 

            打开项目,启动MainActivity, 在Activity中启动服务(onCreate, onStartCommand),再绑定服务(onBind); 再解除绑定服务(onUnBind); 再接返回键销毁MainActivity对象(onUnBind);再打开项目启动MainActivity;再绑定服务,这次绑定服务时会调用onReBind方法

     

     

    代码演示样例:

    activity_main.xml文件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context="com.qf.act.MainActivity"
        tools:ignore="MergeRootFrame,Orientation" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="TextView1" />
    
        <Button
            android:id="@+id/bind"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="work"
            android:text="bind" />
    
        <Button
            android:id="@+id/unbind"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="work"
            android:text="unbind" />
    
        <Button
            android:id="@+id/call"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="work"
            android:text="call" />
    
    </LinearLayout>

    LocalService.java文件

    package com.qf.act;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.Binder;
    import android.os.IBinder;
    import android.util.Log;
    
    public class LocalService extends Service {
    	private static String LOG = "LocalService";
    	private int count = 0;
    	private IBinder binder = new MyIbinder();
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		Log.e(LOG, "onBind");
    		return this.binder;
    	}
    
    	@Override
    	public boolean onUnbind(Intent intent) {
    		Log.e(LOG, "onUnBind");
    		return true;
    	}
    
    	@Override
    	public void onRebind(Intent intent) {
    		super.onRebind(intent);
    		Log.e(LOG, "onRebind");
    	}
    
    	@Override
    	public void onCreate() {
    		new Thread() {
    			public void run() {
    				Log.e(LOG, "onCreate");
    				for (int i = 0; i < 100; i++) {
    					count++;
    					try {
    						Thread.sleep(1000);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}
    		}.start();
    		super.onCreate();
    	}
    
    	public class MyIbinder extends Binder {
    		public int getCount() {
    			return LocalService.this.getCount();
    		}
    	}
    
    	public int getCount() {
    		return this.count;
    	}
    
    	@Override
    	public void onDestroy() {
    		Log.e(LOG, "onDestroy");
    		super.onDestroy();
    	}
    }
    


    MainActivity.java文件

    package com.qf.act;
    
    import com.qf.act.LocalService.MyIbinder;
    
    import android.app.Activity;
    import android.app.Service;
    import android.content.ComponentName;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.util.Log;
    import android.view.View;
    import android.widget.Toast;
    public class MainActivity extends Activity {
    	private boolean isBind = false;
    	private LocalService.MyIbinder binder = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        public void work(View v) {
        	Intent intent = new Intent();
        	intent.setClass(this, LocalService.class);
        	switch (v.getId()) {
        	case R.id.start:
        		this.startService(intent);
        		break;
        	case R.id.stop:
        		this.stopService(intent);
        		break;
    		case R.id.bind:
    			this.bindService(intent, conn, Service.BIND_AUTO_CREATE);
    			break;
    		case R.id.unbind:
    			if(isBind == true)
    			{
    				unbindService(conn);
    				isBind = false;
    			}
    			break;
    		case R.id.call:
    			if(this.binder == null) 
    				return;
    			int count = this.binder.getCount();
    			Toast.makeText(this, ""+count, 1).show();
    			break;
    		}
        }
        private ServiceConnection conn = new ServiceConnection() {
    		@Override
    		public void onServiceDisconnected(ComponentName name) {
    			Log.e("", "onServiceDisconnected");
    		}
    		@Override
    		public void onServiceConnected(ComponentName name, IBinder service) {
    			binder = (MyIbinder) service;
    			isBind = true;
    		}
    	};
    }
    

    操作演示样例:

         1.点击button  启动服务

           日志信息:       onCreate

        2.  点击button  bind

           日志信息:    onBind

        3.点击button  unbind

            日志信息:   onUnBind

        4.点击button  bind

            日志信息:  onReBind

  • 相关阅读:
    Python基础
    SQL脚本
    PDF技术之-jasperreports的使用
    redis缓存和mysql数据库如何保证数据一致性
    理解MySQL的乐观锁,悲观锁与MVCC
    intellj idea创建maven项目一直处于加载的解决问题
    Linux目录详解,软件应该安装到哪个目录
    总结
    总结
    总结
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7159866.html
Copyright © 2011-2022 走看看