`
malong26
  • 浏览: 166990 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用观察者模式完美实现android程序退出

阅读更多
    android的app程序退出有几种方式:activity队列方式、广播方式。在这里介绍一下我实现该功能的方式--观察者模式。
    方法的大概思路为:建立Activity基类,实现观察者接口,实现监听方法,finish掉本实例;在Application里面单例一个目标对象,当需要关闭程序的时候,调用目标对象的通知方法,通知所有观察者。
    代码如下:
观察者接口
public interface Observer {
	public void update(Subject subject);
}

目标对象基类
public class Subject {
	private List<Observer> observers = new ArrayList<Observer>();
	
	public void attach(Observer observer){
		observers.add(observer);
	}

	public void detach(Observer observer){
		observers.remove(observer);
	}
	
	protected void notifyObservers(){
		for(Observer observer : observers){
			observer.update(this);
		}
	}
}


目标对象子类(实现具体退出方法)
public class ApplicationSubject extends Subject {
	public void exit(){
		notifyObservers();
	}
}

MyApplication类(在Manifest文件中将标签application的name改为本类的全限定名)
public class MyApplication extends Application {

	private static ApplicationSubject applicationSubject;
	
	public ApplicationSubject getApplicationSubject() {
                if(applicationSubject == null) applicationSubject = new ApplicationSubject();
		return applicationSubject;
	}
	
}


Activity基类
public abstract class BaseActivity extends Activity implements Observer {

	public MyApplication app;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		app = (MyApplication) this.getApplication();
		app.getApplicationSubject().attach(this);
	}

	@Override
	public void finish() {
		// TODO Auto-generated method stub
                app.getApplicationSubject().detach(this);
		super.finish();
	}

	/**
	 * 关闭程序
	 */
	public void close() {
		app.getApplicationSubject().exit();
	};
	
	@Override
	public void update(Subject subject) {
		// TODO Auto-generated method stub
		this.finish();
	}
	
}


写几个测试页面测试一下
public class ATestActivity extends BaseActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		startActivity(new Intent(this, BTestActivity.class));
	}
}
public class BTestActivity extends BaseActivity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		close(); //在BTestActivity中调用close方法,发现A和B都关闭了
	}
}
3
4
分享到:
评论
8 楼 温婉柳叶眉 2017-07-28  
可以的,测试了。
7 楼 小骏向前冲 2013-11-14  
挺好的,只要是继承自baseActivity的某一个类调用finish,就会通知所有继承baseActivity的类finish掉自己,应该是这样吧,不过如果给类Subject中的observers加上static,把类MyApplication的applicationSubject域的static去掉,是不是更好理解一点
6 楼 malong26 2013-05-25  
LinApex 写道
不错,使用设计模式是好事,但是也不能滥用。直接继承一个BaseActivity,保存所有的Activity,退出的时候全都finish掉就可以了。

如果用队列保存Activity,在使用Flag启动Activity的时候你会发现捉襟见肘。
5 楼 malong26 2013-05-25  
su1216 写道
finish和退出根本不是一个概念

那退出是什么概念呢?
4 楼 malong26 2013-05-25  
zhj198877 写道
貌似不行。。。

哪有问题?
3 楼 zhj198877 2013-05-24  
貌似不行。。。
2 楼 su1216 2013-05-03  
finish和退出根本不是一个概念
1 楼 LinApex 2013-05-02  
不错,使用设计模式是好事,但是也不能滥用。直接继承一个BaseActivity,保存所有的Activity,退出的时候全都finish掉就可以了。

相关推荐

Global site tag (gtag.js) - Google Analytics