在新開項目中需要我們完成的動作ActivityQueueManager 、BaseActivity、SharedPreferencesUtil

1.ActivityQueueManager

當我們寫一個android項目時,很多時候我們都想自己管理我們的activity隊列,比如當我們開啓新的activity時就加人到隊列,當我們finish時就從隊列中刪除。這樣還有一個很明顯的好處就是,當我們退出應用時直接遍歷這個隊列把其中加人的activity挨個finish掉即可。

這裏我們需要提供出來的方法:

  • 添加一個activity(pushActivity)
  • 刪除一個activity(popActivity)
  • 獲取隊列中最上層activity(pop)
  • 獲取隊列中的某一個activity(popIndex)
  • 刪除掉隊列中所有的activity,退出應用使用(finishAllActivity)
  • 關閉掉隊列中的最上層的N個activity,很多應用需要的一個方法(closeNumberActivities)

下面爲java代碼:

public class ActivityQueueManager {

    private static final ActivityQueueManager mInstance = new ActivityQueueManager();

    private final static String TAG = ActivityQueueManager.class.getSimpleName();
    private static LinkedList<Activity> mQueue;

    private ActivityQueueManager() {
        ActivityQueueManager.mQueue = new LinkedList<Activity>();
    }

    /**
     * push activity to queue
     * 
     * @param activity
     * @return void
     * @throws
     */
    public void pushActivity(Activity activity) {
        mInstance.doPushActivity(activity);
        Log.v(TAG, "pushActivity size=" + mQueue.size() + " name=" + activity.getLocalClassName());
    }

    /**
     * pop activity from queue
     * 
     * @param activity
     * @return void
     * @throws
     */
    public void popActivity(Activity activity) {
        mInstance.doPopActivity(activity);
        Log.v(TAG, "popActivity size=" + mQueue.size() + " name=" + activity.getLocalClassName());
    }

    /**
     * pop the stack top activity
     * 
     * @return Activity
     * @throws
     */
    public Activity pop() {
        if (mQueue != null && mQueue.size() > 0) {
            return mQueue.peek();
        } else {
            return null;
        }
    }

    /**
     * pop the postion activity
     * 
     * @return Activity
     * @throws
     */
    public Activity popIndex(int postion) {
        if (mQueue != null && mQueue.size() > postion) {
            return mQueue.get(postion);
        } else {
            return null;
        }
    }

    /**
     * finish all activity from queue
     * 
     * @return void
     * @throws
     */
    public void finishAllActivity() {
        mInstance.doFinishAll();
    }

    @SuppressLint("NewApi")
    public void doPushActivity(Activity activity) {
        // 解決系統2.2版本的bug
        if (android.os.Build.VERSION.SDK_INT > Build.VERSION_CODES.FROYO) {
            mQueue.push(activity);
        } else {
            mQueue.addFirst(activity);
        }
    }

    public void doPopActivity(Activity activity) {
        if (ActivityQueueManager.mQueue.contains(activity)) {
            ActivityQueueManager.mQueue.remove(activity);
        }
    }

    public void doFinishAll() {
        Iterator<Activity> it = mQueue.iterator();
        while (it.hasNext()) {
            Activity a = it.next();
            it.remove();
            a.finish();
        }
    }

    public static ActivityQueueManager getInstance() {
        return mInstance;
    }

    public LinkedList<Activity> getActivityLinkQueue() {
        return mQueue;
    }

    public int getSize() {
        return mQueue.size();
    }


    /**
     * 關閉N個activities
     * @param closeNumberActivities 關閉activity的個數
     */
    public void closeNumberActivities(int closeNumberActivities) {
        // 關閉個數小於1的時候直接跳出
        if (closeNumberActivities <= 0) {
            return;
        }
        LinkedList<Activity> mActivities = mQueue;
        if (mActivities != null && mActivities.size() <= 1) {
            return;
        }

        try {
            int countTemp = 0;
            // 倒序遍歷acitivty
            for (int i = mActivities.size() - 1; i >= 0; i--) {
                // 如果當前頁面爲NativeAppActivity,則直接finish();
                Activity mActivity = mActivities.get(i);
                if (mActivity != null ) {
                    mActivity.finish();
                    mActivities.remove(mActivity);
                }
                // 其他情況下finish掉activity
                else {
                    // 當前頁面不能是最後一頁
                    if (mActivities.size() > 1 ) {
                        mActivity.finish();
                        mActivities.remove(mActivity);
                        countTemp ++;
                    } else {
                        i = -1;
                    }
                }
                // 退出循環
                if (countTemp == closeNumberActivities) {
                    i = -1;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

下面就是調用過程了。只要我們在activity的onCreate方法中調用pushActivity添加,在onDestroy中調用popActivity移除即可。當然我們不會再每一個activity中都去做這個操作。我們只需要實現一個BaseActivity基類即可。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    app = (LoveApplication) getApplication();
    //添加
    ActivityQueueManager.getInstance().pushActivity(this);

}

@Override
protected void onDestroy() {
    super.onDestroy();
    //移除
    ActivityQueueManager.getInstance().popActivity(this);
}

到這裏我們只說了一個activity的管理,下面我們繼續在我們的項目中,我們還在BaseActivity中完成了什麼

2.BaseActivity

  • 我們在activity中經常打開新的activity(openActivity)
  • 我們打開新的activityForResult(openActivityForResult)
  • 我們需要的dip、px互換(dip2px、px2dip)
  • 我們需要toast打印(showToastSafe)
  • 部分需要,在使用sp爲字體大小單位時設置字體不隨系統變化而變化(重寫getResources方法)
public class BaseActivity extends InitActivity {
    /** UI 線程ID */
    private long mUIThreadId;
    protected LoveApplication app;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        app = (LoveApplication) getApplication();
        ActivityQueueManager.getInstance().pushActivity(this);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ActivityQueueManager.getInstance().popActivity(this);
    }


    /**
     * 通過類名啓動Activity
     * 
     * @param pClass
     */
    protected void openActivity(Class<?> pClass) {
        openActivity(pClass, null);
    }

    protected void openActivity(Class<?> pClass, String key, String value) {
        Intent intent = new Intent(this, pClass);
        intent.putExtra(key, value);
        startActivity(intent);
    }

    /**
     * 通過類名啓動Activity,並且含有Bundle數據
     * 
     * @param pClass
     * @param pBundle
     */
    protected void openActivity(Class<?> pClass, Bundle pBundle) {
        Intent intent = new Intent(this, pClass);
        if (pBundle != null) {
            intent.putExtras(pBundle);
        }
        startActivity(intent);
    }

    public void openActivityForResult(Class<?> pClass, String key, String value, int requestCode) {
        Intent intent = new Intent(this, pClass);
        intent.putExtra(key, value);
        openActivityForResult(pClass, null, requestCode);
    }

    public void openActivityForResult(Class<?> pClass, int requestCode) {
        openActivityForResult(pClass, null, requestCode);
    }

    protected void openActivityForResult(Class<?> pClass, Bundle pBundle, int pRrequestCode) {
        Intent intent = new Intent(this, pClass);
        if (pBundle != null) {
            intent.putExtras(pBundle);
        }
        startActivityForResult(intent, pRrequestCode);
    }


    /** dip轉換px */
    public int dip2px(int dip) {
        final float scale = getResources().getDisplayMetrics().density;
        return (int) (dip * scale + 0.5f);
    }

    /** pxz轉換dip */
    public int px2dip(int px) {
        final float scale = getResources().getDisplayMetrics().density;
        return (int) (px / scale + 0.5f);
    }

    /** 對toast的簡易封裝。線程安全,可以在非UI線程調用。 */
    public void showToastSafe(final int resId, final int duration) {
        if (Process.myTid() == mUIThreadId) {
            // 調用在UI線程
            Toast.makeText(getBaseContext(), resId, duration).show();
        } else {
            // 調用在非UI線程
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getBaseContext(), resId, duration).show();
                }
            });
        }
    }

    /** 對toast的簡易封裝。線程安全,可以在非UI線程調用。 */
    public void showToastSafe(final CharSequence text, final int duration) {
        if (Process.myTid() == mUIThreadId) {
            // 調用在UI線程
            Toast.makeText(getBaseContext(), text, duration).show();
        } else {
            // 調用在非UI線程
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getBaseContext(), text, duration).show();
                }
            });
        }
    }


    /*
     * 設置字體不隨系統變化而變化
     */
    @Override  
    public Resources getResources() {  
        Resources res = super.getResources();    
        Configuration config=new Configuration();    
        config.setToDefaults(); 
        if(res != null){
            res.updateConfiguration(config,res.getDisplayMetrics() );  
        }
        return res;  
    }  

}

3.SharedPreferencesUtil

項目中少不了用sharedPreferences來存儲數據,爲了新項目方便,我們直接定義出SharedPreferencesUtil

  • 單例模式
  • 添加(putXX)
  • 刪除(reomve)
  • 獲取(getXX)
public class SharedPreferencesUtil {

    private SharedPreferences sp;

    private static SharedPreferencesUtil spUtil;

    private SharedPreferencesUtil(Context context){
        sp = PreferenceManager.getDefaultSharedPreferences(context);
    }

    public static SharedPreferencesUtil getSharedPreferences(Context context){
        if(spUtil == null){
           spUtil = new SharedPreferencesUtil(context);
        }
        return spUtil;
    }

    public void remove(String key){
        if(sp != null){
           sp.edit().remove(key).commit();
        }
    }

    public void putBoolean(String key, boolean value){
        if(sp != null){
           sp.edit().putBoolean(key, value).commit();
        }
    }

    public void putFloat(String key, float value){
        if(sp != null){
           sp.edit().putFloat(key, value).commit();
        }
    }

    public void putInt(String key, int value){
        if(sp != null){
           sp.edit().putInt(key, value).commit();
        }
    }

    public void putLong(String key, long value){
        if(sp != null){
           sp.edit().putLong(key, value).commit();
        }
    }

    public void putString(String key, String value){
        if(sp != null){
           sp.edit().putString(key, value).commit();
        }
    }

    public String getString(String key, String defValue){
        String value = null;
        if(sp != null){
            value = sp.getString(key, defValue);
        }
        return value;
    }

    public boolean getBoolean(String key, boolean defValue){
        boolean value = false;
        if(sp != null){
           value = sp.getBoolean(key, defValue);
        }
        return value;
    }

    public int getInt(String key, int defValue){
        int value = 0;
        if(sp != null){
           value = sp.getInt(key, defValue);
        }
        return value;
    }

    public long getLong(String key, long defValue){
        long value = 0;
        if(sp != null){
           value = sp.getLong(key, defValue);
        }
        return value;
    }

    public void clearAll(){
        if(sp != null){
           sp.edit().clear().commit();
        }
    }
}

當然,如果需要我們同樣可以將SharedPreferencesUtil加入到BaseActivity中,方便我們用的時候直接調用,這就看各位了。

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