码迷,mamicode.com
首页 > 其他好文 > 详细

Activity与本地Service的绑定

时间:2015-08-20 18:56:58      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:绑定service

在Android应用程序中,Activity负责界面的显示,Service负责后台工作,当然后台和界面是需要交互的,所以Activity需要和Service交互.

比较常用的是Activity和本地Service的交互,本文介绍的便是这种,最终实现Activity和Service都能很方便地调用对方的public方法。


其实只要让Activity和Service绑定之后,分别拥有对方的引用就可以了。


以MainActivity和MyService为例


创建一个服务类MyService.java

public class MyService extends Service {

	private MainActivity activity;
	

	@Override
	public IBinder onBind(Intent arg0) {
		return new MyBinder();
	}

	/**
	 * 与activity绑定后返回的Binder
	 */
	public class MyBinder extends Binder {
		// 获取service对象的引用
		public MyService getService() {
			return MyService.this;
		}
	}
   
	public void setActivity( MainActivity _activity){
		this.activity =  _activity;
	}
	
}

让Service中拥有一个Activity类型的成员,并提供setActivity()方法


注意要在androidManifest中声明该Service

<service
            android:name=".MyService"
            ></service>


然后在MainActivity中实现绑定

public class MainActivity extends Activity {

// 本地服务
	private MyService mLocalService;

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

		bindLocalService();
	}

	/**
	 * 创建并绑定本地Service
	 * */
	private void bindLocalService() {
		Intent bindIntent = new Intent(this, MyService.class);
		bindService(bindIntent, localServiceConnection, BIND_AUTO_CREATE);
	}

/**
	 * 绑定本地服务的ServiceConnection类
	 */
	ServiceConnection localServiceConnection = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName arg0) {
			mLocalService = null;
		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			MyBinder myBinder = (MyService.MyBinder) service;
			mLocalService = myBinder.getService();
			mLocalService.setActivity(MainActivity.this);

		}
	};

}



要点是这里

@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			MyBinder myBinder = (MyService.MyBinder) service;
			mLocalService = myBinder.getService();
			mLocalService.setActivity(MainActivity.this);

		}

实现绑定之后,MainActivity里的mLocalService成员指向MyService对象的引用,而MyService里的activity成员指向MainActivity的引用

这样一来,就可以调用对方里的public方法了


比如

1. MyService里有一个方法

public void print(String s){
   System.out.println("is in service --> "+s);
}

则在MainActivity中可以这样调用

mLocalService.print("call from activity");

2. MainActivity里有一个TextView对象textView,并有更新textView内容的方法

public void updateTextView(String s){
   textView.setText(s);
}

则在MyService中可以这样调用

activity.updateTextView("service call the fun in activity");


如果在Service里创建了新线程,则新线程与activity的UI线程的通信用的是异步消息处理机制,可在MainActivity中创建一个public static 的Handler对象

	public static Handler handler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			System.out.println("handler say something");
		}
	};

然后在MyService中获得这个handler的引用 

private Handler mHandler = MainActivity.handler;

这样子,MyService里就也能方便地用mHandler来更新UI了


还有用广播Broadcast来实现Service通知UI更新的,不过这样消耗太大,不建议这么做


上面的做法,即实现了Service与Activity的交互,也让这两个类的尽量独立解藕,方便类的维护。









版权声明:本文为博主原创文章,未经博主允许不得转载。

Activity与本地Service的绑定

标签:绑定service

原文地址:http://blog.csdn.net/guige_csdn/article/details/47809895

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!