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中,方便我們用的時候直接調用,這就看各位了。