«

绑定服务时什么时候调用onRebind

时间:2024-3-2 19:07     作者:韩俊     分类: Android


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.点击按钮 启动服务

日志信息: onCreate

2. 点击按钮 bind

日志信息: onBind

3.点击按钮 unbind

日志信息: onUnBind

4.点击按钮 bind

日志信息: onReBind

标签: android

热门推荐