android的app程序退出有幾種方式:activity隊列方式、廣播方式。在這里介紹一下我實現(xiàn)該功能的方式--觀察者模式。
方法的大概思路為:建立Activity基類,實現(xiàn)觀察者接口,實現(xiàn)監(jiān)聽方法,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);
- }
- }
- }
目標對象子類(實現(xiàn)具體退出方法)
- 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方法,發(fā)現(xiàn)A和B都關閉了
- }
- }
分享到:
評論
 挺好的,只要是繼承自baseActivity的某一個類調用finish,就會通知所有繼承baseActivity的類finish掉自己,應該是這樣吧,不過如果給類Subject中的observers加上static,把類MyApplication的applicationSubject域的static去掉,是不是更好理解一點
LinApex 寫道 不錯,使用設計模式是好事,但是也不能濫用。直接繼承一個BaseActivity,保存所有的Activity,退出的時候全都finish掉就可以了。 如果用隊列保存Activity,在使用Flag啟動Activity的時候你會發(fā)現(xiàn)捉襟見肘。
su1216 寫道 finish和退出根本不是一個概念 那退出是什么概念呢?
zhj198877 寫道  貌似不行。。。 哪有問題?
 貌似不行。。。
不錯,使用設計模式是好事,但是也不能濫用。直接繼承一個BaseActivity,保存所有的Activity,退出的時候全都finish掉就可以了。
|