service与activity通信 之 bindService

此文是在网友文章基础上经过修改得到的,在此处谢谢慷慨的网友们。


本文是只是localService与activity通信

思路很简单,是这样的:在localservice中,有一个不断累加的整数i,在activity中启动service(bindService),然后把service中的当前i值返回给acitivity。

代码如下:

LocalService:

<pre name="code" class="java">public class LocalService extends Service{
	int i ; //需要返回的i值
	
	private final IBinder myBinder = new LocalBinder();
     public class LocalBinder extends Binder{  //用Binder的子类,返回service实例
		LocalService getService(){
			return LocalService.this;
		}
	}

	@Override
	public void onCreate() {  //启动线程
		MyThread mt = new MyThread();
		Thread t= new Thread(mt);
		t.start();
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	@Override
	public IBinder onBind(Intent intent) {   //通过返回myBinder,activity可以得到Service的实例,这样就可以调用service中的public方法了 
		// TODO Auto-generated method stub
		return myBinder;
	}
	
	class MyThread implements Runnable{
		@Override
		public void run() {
			getNum();  //调用函数
		}
	}
	
	public void getNum(){//在后台中一直运行,不断更新i的值
		while (true) {
			i++;
			Log.d("abc--i",String.valueOf(i));
		}
	}
	
	public int getNumber() {//提供public方法,可以在activity中调用,返回当前的i值
		return i;
	}

}



以下是acitivity代码:

public class MainActivity extends Activity {
    LocalService mService;    // Service对象
    boolean ifBound = false;  //是否绑定成功

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        // 绑定Service,绑定以后就会调用conn里的onServiceConnected方法
        Intent intent = new Intent(this, LocalService.class);
        bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // 解绑Service
        if (ifBound) {
            unbindService(conn);
            ifBound = false;
        }
    }

    public void onButtonClick(View v) {
        if (ifBound) {
            // 用Service的对象,去读i的值
            int num = mService.getNumber();
            Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show();
        }
    }

    //  Called when a connection to the Service has been established, 
    //with the IBinder of the communication channel to the Service.
    private ServiceConnection conn = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName className,
                IBinder service) {
            // 已经绑定了LocalService,强转IBinder对象,调用方法得到LocalService对象
            LocalBinder binder = (LocalBinder) service;
            mService = binder.getService();
            ifBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            ifBound = false;
        }
    };
}


界面简单,只有一个button ,点击调用onButtonClick方法,获取i值。
例子很简单,虽然是新手,希望跟大家交流,不断成长。


发布了5 篇原创文章 · 获赞 4 · 访问量 9772
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览