安卓开发观察者模式应用-一个service通知多个activity更新ui的实现

xiaoxiao2021-02-28  158

service与activity的交互: 1.接口回调 2.自定义广播 3.观察者模式

demo下载地址 源码传送门

今天练习了下使用观察者模式,service与多个activity的交互

service的实现

package com.joey.observabledemo; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.support.annotation.Nullable; import java.util.Observable; import java.util.Observer; /** * Created by Administrator on 2017/8/31. */ public class ContentService extends Service{ private MyObservable myObservable; @Nullable @Override public IBinder onBind(Intent intent) { return new LocalBinder(); } public final class LocalBinder extends Binder{ public ContentService getService(){ return ContentService.this; } } public void asyncPostPerson(final String name){ //模拟耗时,终止5秒 new Thread(){ @Override public void run() { super.run(); try { sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } handler.sendMessage(handler.obtainMessage(0x01,name)); } }.start(); } /** * 添加观察者 * @param observer */ public void addObservable(Observer observer){ myObservable.addObserver(observer); } @Override public void onCreate() { super.onCreate(); myObservable = new MyObservable(); } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 0x01: String name = (String) msg.obj; Person person = new Person(); person.setName(name); myObservable.notifyChanged(person); break; default: break; } } }; private class MyObservable extends Observable{ public void notifyChanged(Person person){ this.setChanged(); this.notifyObservers(person); } } }

一个activity

public class MainActivity extends AppCompatActivity implements Observer{ private ContentService mService; private MyServiceConn conn; private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = (TextView) findViewById(R.id.content); conn = new MyServiceConn(); bindService(new Intent(this,ContentService.class),conn,BIND_AUTO_CREATE); } public void btnClick(View view) { switch (view.getId()){ case R.id.button1: startActivity(new Intent(MainActivity.this,SecondActivity.class)); break; default: break; } } public class MyServiceConn implements ServiceConnection{ @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { mService = ((ContentService.LocalBinder) iBinder).getService(); //将当前Activity添加为观察者 mService.addObservable(MainActivity.this); } @Override public void onServiceDisconnected(ComponentName componentName) { mService = null; } } @Override protected void onDestroy() { super.onDestroy(); unbindService(conn); } @Override public void update(Observable observable, Object o) { Person person = (Person) o; tv.setText(person.toString()); } }

第二个activity

public class SecondActivity extends AppCompatActivity implements Observer{ private TextView textView; private MyServiceConnection connection; private ContentService contentService; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); textView = (TextView) findViewById(R.id.content2); connection = new MyServiceConnection(); bindService(new Intent(SecondActivity.this,ContentService.class),connection,BIND_AUTO_CREATE); } public void btnClick(View view) { switch (view.getId()){ case R.id.button2: contentService.asyncPostPerson("大理石"); break; default: break; } } public class MyServiceConnection implements ServiceConnection{ @Override public void onServiceConnected(ComponentName componentName, IBinder iBinder) { contentService = ((ContentService.LocalBinder) iBinder).getService(); contentService.addObservable(SecondActivity.this); } @Override public void onServiceDisconnected(ComponentName componentName) { contentService = null; } } @Override protected void onDestroy() { super.onDestroy(); unbindService(connection); } @Override public void update(Observable observable, Object o) { Person person = ((Person) o); textView.setText(person.toString()); } }

实体类

public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + '}'; } }

demo下载 源码传送门

xml就不贴了 ,一看就懂

转载请注明原文地址: https://www.6miu.com/read-44941.html

最新回复(0)