單例模式——activity的管理

在開發中很多時候會碰到從A activity跳轉到B activity,當用戶提交完數據後,要關閉B activity,同時也要關閉A activity,其實要實現該功能有很多種方式:使用EventBus、使用廣播、activity啓動模式等,這裏的話是從用單例管理activity方式,剛好在整個應用中也需要對開啓和finish的activity進行管理;

public class AppActivityManager {
    private Stack<Activity> mActivitys;

    private AppActivityManager() {
        mActivitys = new Stack<>();
    }

    private static class AppActivityInnerManager {
        private static AppActivityManager activityManager = new AppActivityManager();
    }

    public static AppActivityManager getInstance() {
        return AppActivityInnerManager.activityManager;
    }

    /**
     * 添加activity
     *
     * @param activity
     */
    public void addActivity(Activity activity) {
        mActivitys.add(activity);
    }

    /**
     * 移除activity
     *
     * @param activity
     */
    public void removeActivity(Activity activity) {
        int size = mActivitys.size();
        for (int i = 0; i < size; i++) {
            Activity activity1 = mActivitys.get(i);
            if (activity1 == activity) {
                mActivitys.remove(i);
                i--;
                size--;
            }
        }
    }

    /**
     * 關閉指定的activity
     *
     * @param activity
     */
    public void finishActivity(Activity activity) {
        int size = mActivitys.size();
        for (int i = 0; i < size; i++) {
            Activity activity1 = mActivitys.get(i);
            if (activity1 == activity) {
                activity1.finish();
                mActivitys.remove(i);
                i--;
                size--;
            }
        }
    }

    /**
     * 關閉指定的activity
     * @param activityClass
     */
    public void finishActivity(Class activityClass){
        int size = mActivitys.size();
        for (int i = 0; i < size; i++) {
            Activity activity1 = mActivitys.get(i);
            if (activity1.getClass().getCanonicalName().equals(activityClass.getCanonicalName())) {
                activity1.finish();
                mActivitys.remove(i);
                i--;
                size--;
            }
        }
    }

    /**
     * 獲取當前的activity
     * @return
     */
    public Activity currentActivity(){
        return mActivitys.lastElement();
    }

    /**
     * 退出應用程序
     */
    public void exitApp(){
        int size = mActivitys.size();
        for (int i = 0; i < size; i++) {
            Activity activity = mActivitys.get(i);
            activity.finish();
            mActivitys.remove(i);
            i--;
            size--;
        }
    }
}

就是一個這樣的單例類,裏面採用的是靜態內部類的方式,關於單例模式可以看單例模式;創建了一個Stack集合用來管理activity,也可以用List,LinkList集合,不過在管理activity時添加和刪除操作比較多,List的是數組結構增刪的效率沒有LinkList和Stack好,Stack和LinkList比較的話,Stack是同步的,線程安全些,所以還是採用Stack來存儲管理activity;在對activity進行刪除時需要注意對一個集合遍歷循環刪除容易出現數組角標越界的問題,所以刪除一個後,對i--同時對size--;在使用時可以在BaseActivity的onCreate方法中進行添加,在onDestory方法中進行移除;

public class BaseActivity extends AppCompatActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //添加當前activity
        AppActivityManager.getInstance().addActivity(this);
    }

    @Override
    protected void onDestroy() {
        //移除當前activity
        AppActivityManager.getInstance().removeActivity(this);
        super.onDestroy();
    }
}

需要關閉指定的activity的話,調用finishActivity方法,將指定的activity或者activity的Class傳入就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章