在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的交互,也让这两个类的尽量独立解藕,方便类的维护。
版权声明:本文为博主原创文章,未经博主允许不得转载。