`
malong26
  • 浏览: 168732 次
  • 性别: 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掉就可以了。

相关推荐

    一个类实现Android观察者模式(最简单实用的观察者模式)

    下面将详细阐述Android中的观察者模式以及如何实现。 ### 1. 观察者模式的基本概念 观察者模式又称为发布-订阅模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到...

    观察者模式以及在Android开发中的应用

    总结起来,观察者模式在Android开发中主要体现在BroadcastReceiver和ContentObserver的使用上,它们帮助开发者实现组件间的通信和数据同步,提高了代码的灵活性和可维护性。通过ContentProvider,Android提供了一个...

    设计模式-观察者模式(讲解及其实现代码)

    观察者模式,也被称为发布-订阅模式,是软件设计中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的...在实际项目中,正确使用观察者模式可以有效地管理组件间的交互,实现高效且易于维护的代码结构。

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,...同时,现代编程语言和框架(如React的生命周期方法、Angular的事件机制等)也内置了观察者模式的概念,使得开发者可以更方便地使用和理解这一模式。

    设计模式 观察者模式 以Android中TextView文本内容发生变化为背景

    在这个背景下,我们以Android中的TextView为例,来深入探讨观察者模式在实际开发中的应用。 在Android系统中,TextView是一个用于显示文本的视图组件。它可以显示静态文本,也可以动态地更新内容,比如从网络获取...

    设计模式-观察者

    4. **接口分离**:观察者模式鼓励接口分离原则,即主题不应该知道观察者具体是如何处理通知的,观察者也不应该知道主题的具体实现。这样,两者可以独立地变化和扩展。 5. **应用实例**:观察者模式广泛应用于各种...

    设计模式之观察者模式Java实现

    为了实现观察者模式,你需要创建一个实现了`Observer`接口的类,这个类代表具体的观察者。在这个类中,你需要实现`update()`方法,定义当接收到通知时应执行的操作。 接下来,我们可以创建一个具体的`Observable`...

    Android观察者模式简单实现Demo

    在Android系统中,观察者模式的实现主要依赖于`java.util.Observable`和`java.util.Observer`接口。`Observable`类代表被观察的对象,它可以添加、删除观察者,并在状态改变时通知它们。`Observer`接口则定义了观察...

    android Observer(观察者模式)_案例祥解.pdf

    本文将详细讲解观察者模式的概念和实现,通过代码注释来解释各个组件的作用。 一、观察者模式的定义 观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,使得一个对象的状态发生变化时,所有依赖它...

    C++ 实现观察者模式小例子

    文件"Event"可能包含了这些类的定义和实现,以及一个主程序,用于创建主题对象,添加观察者,模拟状态变化并触发通知。通过阅读和分析这个代码,我们可以更深入地理解C++中观察者模式的实现细节。 总的来说,观察者...

    请根据观察者模式,用Java语言设计并实现气象站程序。

    请根据观察者模式,用Java语言设计并实现气象站程序。其中,部分代码已经写好,包括: • 观察者接口 • 主题接口 • 显示板接口 • 测试程序 请在此框架下,继续完成CurrentConditionsDisplay、ForecastDisplay...

    android学习日记-6 观察者模式与订阅者模式

    在Android中,我们通常使用`BroadcastReceiver`来实现观察者模式,通过发送广播(Broadcast)和接收广播(BroadcastReceiver)来实现组件间的通信。 观察者模式的主要步骤包括: 1. 创建被观察者类,该类通常包含一...

    基于观察者模式两个activity通信

    在这个场景中,我们关注的是如何使用观察者模式(Observer Pattern)来实现Activity A和C之间的数据交互。观察者模式是一种行为设计模式,它允许一个对象(观察者)在另一个对象(被观察者)的状态改变时自动收到...

    Android 设计模式:(一)观察者模式 —— 封装行为的大局观

    在Android开发中,设计模式是提升代码质量和可维护性的重要工具。本文将深入探讨其中的一种...在实际项目中,观察者模式与其他设计模式(如工厂模式、单例模式)结合使用,可以构建出更健壮、可扩展的Android应用程序。

    观察者模式 c++ 实现

    在C++中实现观察者模式,可以使用`std::vector`或其他容器来存储观察者,这样可以方便地添加、删除观察者。同时,可以利用虚函数或者纯虚函数来定义观察者接口,确保所有观察者都能响应主题的更新。 下面是一个简单...

    观察者模式学习

    除了标准实现,还有很多其他语言和框架提供了观察者模式的支持,例如在C#中,可以使用System.ComponentModel.INotifyPropertyChanged接口来实现,而在JavaScript中,可以通过事件监听器或者发布/订阅模式来实现类似...

    Android观察者模式

    总之,Android观察者模式是实现组件间通信和UI更新的关键工具,通过合理的运用,可以使应用程序更加灵活、响应式,并降低组件间的耦合度。无论是传统的BroadcastReceiver,还是现代的LiveData,都是观察者模式在...

    Android观察者模式设计思想

    5. **RxBinding**: RxBinding库将Android事件转换为RxJava的Observable流,这样开发者可以使用RX的特性(如map、filter、merge等)来处理事件,同样基于观察者模式,但提供了更强大的异步编程能力。 6. **...

    56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1

    观察者模式的实现方式有很多种,根据不同的应用场景和需求,可以有完全不同的实现方式。下面是一种经典的实现方式: ```java public interface Subject { void registerObserver(Observer observer); void ...

    [android]观察者模式demo

    在Android开发中,观察者模式(Observer Pattern)是一种设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现事件驱动编程,...

Global site tag (gtag.js) - Google Analytics