前言
單例設(shè)計(jì)模式(一) - 定義苇经、volatile關(guān)鍵字好處
單例設(shè)計(jì)模式(二) - 常見(jiàn)幾種寫(xiě)法
單例設(shè)計(jì)模式(三) - 強(qiáng)大的Activity的管理
1. 概述
前兩篇文章已經(jīng)講解了單例設(shè)計(jì)模式的定義、volatile關(guān)鍵字的好處藏鹊、及常見(jiàn)單例設(shè)計(jì)模式的幾種寫(xiě)法现喳,那么這篇文章就記錄下單例設(shè)計(jì)模式使用場(chǎng)景 —— 強(qiáng)大的Activity的管理怔接。
2. 單例使用場(chǎng)景
如上圖所示
場(chǎng)景一:
1>:點(diǎn)擊收藏,如果沒(méi)有登錄,先跳轉(zhuǎn)到登錄頁(yè)面姿现,如果沒(méi)有注冊(cè)肠仪,就去注冊(cè);
2>:注冊(cè)成功并且登錄成功后备典,然后保存用戶(hù)信息异旧;
3>:關(guān)閉注冊(cè)頁(yè)面及登錄頁(yè)面;
場(chǎng)景二:
單點(diǎn)登錄
如果后臺(tái)通知提佣,該賬號(hào)已經(jīng)被擠下線了吮蛹,那么不管你在哪個(gè)頁(yè)面,都需要彈出dialog拌屏,而且必須是Activity的上下文潮针,是否需要在每個(gè)Activity中寫(xiě)代碼,或者說(shuō)直接寫(xiě)到 BaseActivity中即可倚喂;
以上都是單例設(shè)計(jì)模式的使用場(chǎng)景每篷。
對(duì)于場(chǎng)景1:定義一個(gè)ActivityManager管理類(lèi),將其寫(xiě)成單例設(shè)計(jì)模式端圈,并且用Stack棧焦读,類(lèi)型是Activity,管理整個(gè)Activity舱权,然后在每個(gè)Activity的onCreate()中調(diào)用 ActivityManager的 attach()方法矗晃,把Activity添加到棧中,在每個(gè)Activity的onDestroy()方法中宴倍,調(diào)用 detach()方法喧兄,把Activity從棧中移除,代碼如下啊楚;
以下場(chǎng)景是:從MainActivity跳轉(zhuǎn)到 LoginActivity吠冤,然后跳轉(zhuǎn)到RegisterActivity,最終關(guān)閉RegisterActivity和LoginActivity恭理,回到MainActivity
1>:ActivityManager管理類(lèi)代碼如下:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/6 16:30
* Version 1.0
* Params:
* Description: Activity的棧管理
*/
public class ActivityManager {
private static volatile ActivityManager mInstance;
// 集合 有 List LinkedList Stack ?
// 由于刪除和添加比較多拯辙,所以可以使用 Stack棧
private Stack<Activity> mActivities;
private ActivityManager(){
mActivities = new Stack<>();
}
// 雙重校驗(yàn)
public static ActivityManager getInstance() {
if (mInstance == null) {
synchronized (ActivityManager.class) {
if (mInstance == null) {
mInstance = new ActivityManager();
}
}
}
return mInstance;
}
/**
* 添加統(tǒng)一管理
*/
public void attach(Activity activity){
mActivities.add(activity);
}
/**
* 移除解綁 - 防止內(nèi)存泄漏
*/
public void detach(Activity detachActivity){
// for循環(huán) 一邊循環(huán)一邊移除會(huì)出問(wèn)題 ,
/*for (Activity activity : mActivities) {
if(activity == detachActivity){
mActivities.remove(activity);
}
}*/
int size = mActivities.size();
for (int i = 0; i < size; i++) {
Activity activity = mActivities.get(i);
if (activity == detachActivity) {
mActivities.remove(i);
i--;
size--;
}
}
}
/**
* 關(guān)閉當(dāng)前的 Activity
*/
public void finish(Activity finishActivity){
// for循環(huán) 一邊循環(huán)一邊移除會(huì)出問(wèn)題 颜价,
/*for (Activity activity : mActivities) {
if(activity == finishActivity){
mActivities.remove(activity);
activity.finish();
}
}
*/
int size = mActivities.size();
for (int i = 0; i < size; i++) {
Activity activity = mActivities.get(i);
if (activity == finishActivity) {
mActivities.remove(i);
activity.finish();
i--;
size--;
}
}
}
/**
* 根據(jù)Activity的類(lèi)名關(guān)閉 Activity
*/
public void finish(Class<? extends Activity> activityClass){
// for循環(huán) 一邊循環(huán)一邊移除會(huì)出問(wèn)題 涯保,
/*for (Activity activity : mActivities) {
if(activity.getClass().getCanonicalName().equals(activityClass.getCanonicalName())){
mActivities.remove(activity);
activity.finish();
}
}*/
int size = mActivities.size();
for (int i = 0; i < size; i++) {
Activity activity = mActivities.get(i);
if (activity.getClass().getCanonicalName().equals(activityClass.getCanonicalName())) {
mActivities.remove(i);
activity.finish();
i--;
size--;
}
}
}
/**
* 退出整個(gè)應(yīng)用
*/
public void exitApplication(){
}
/**
* 獲取當(dāng)前的Activity(最前面)
*/
public Activity currentActivity(){
return mActivities.lastElement();
}
}
2>:MainActivity代碼如下:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.getInstance().attach(this);
setContentView(R.layout.activity_main);
setTitle("MainActivity");
}
public void click(View view){
Intent intent = new Intent(this,LoginActivity.class);
startActivity(intent);
}
@Override
protected void onDestroy() {
ActivityManager.getInstance().detach(this);
super.onDestroy();
}
}
3>:LoginActivity代碼如下:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/6 16:59
* Version 1.0
* Params:
* Description:
*/
public class LoginActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.getInstance().attach(this);
setContentView(R.layout.activity_main);
setTitle("LoginActivity");
}
public void click(View view){
Intent intent = new Intent(this,RegisterActivity.class);
startActivity(intent);
}
@Override
protected void onDestroy() {
ActivityManager.getInstance().detach(this);
super.onDestroy();
}
}
4>:RegisterActivity代碼如下:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/5/6 16:47
* Version 1.0
* Params:
* Description:
*/
public class RegisterActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityManager.getInstance().attach(this);
setContentView(R.layout.activity_main);
setTitle("RegisterActivity");
}
public void click(View view){
// 不光要關(guān)閉自己還要關(guān)閉 LoginActivity 讓其回到主頁(yè)
ActivityManager.getInstance().finish(this);
ActivityManager.getInstance().finish(LoginActivity.class);
}
@Override
public void onDestroy() {
ActivityManager.getInstance().detach(this);
super.onDestroy();
}
}
代碼已上傳至github:
https://github.com/shuai999/Architect_day8.git