Android Timer

在iOS中timer執行時就是直接new一個Thread來執行,但在Android中似乎有別的方式可以選擇

宣告Timer出來,並給予啟動時間,如下面例子timer.schedule(線程名稱, activity停頓幾秒後開始執行, 每隔幾秒執行一次),這部份直接放在onCreate內
Timer timer = new Timer(true);
timer.schedule( timerTask, 2000, 3000); //(taskName, wait(ms), repet(ms))
//timer.cancel(); //stop timer


timer.schedule裡面也一樣有相當多的method,如上面所寫的那是不斷去執行直到你自己去關閉,那如果只要執行一次就使用
Timer timer = new Timer(true);
timer.schedule( timerTask, 2000); //(線程名稱, 開始後多久執行(ms))
//timer.cancel(); //stop timer


但這裡面可以用的東西也是太多了,我這只有2k的大腦記不住這麼多,補全給他按下去就對了,慢慢挑慢慢選


開始執行Timer的線程,其實也可以直接寫在todo something這邊,但是在線程中作這些實在有點不保險,常常會有意想不到的收穫,所以在這還是會推薦在handler內來作。這部份直接放在activity內
/* timer task */
TimerTask timerTask = new TimerTask(){
public void run() {
//todo something
handler.sendEmptyMessage(10);
}
};


由於用上了handler就必須在activity內再加上要執行的部份,如上面的task內所傳送一個數字過去(就是"10")所以在下方handler內的msg.what所印出來的就是"10",只要寫下"if(msg.what == 10)"要作啥事情即可,以此類推就可以有更多的變化
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
//TODO something
System.out.println("msg = "+msg.what);
if(msg.what == 10){
//
}
}
};


相關連結
Android Developers
Android Developers - Timer
Android Developers - TimerTask
Android Developers - Handler

Android get Device infomation 取得手機裝置資訊

透過android系統可以很方便的取得Device的相關資訊,能夠取得的資訊真的是相當的完整,就如下面這範例想要取得手機的電信業者名稱(如中華電信這類的,但大多是代號),這些資訊作族群分析等這些資訊就變的相當重要,一般使用者可以透過"Settings(設定)>About phone(關於手機)"裡面可以查到手機資訊,不過這只能夠得知自己的資訊,如果今天寫app想要作族群用戶分析等,在android這系統上也可以很輕鬆的取得這些資訊。

下面這carrierName就是電信業者的名稱
String carrierName = ((TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE)).getNetworkOperatorName();
System.out.println("carrierName = "+carrierName);


透過"TelephonyManager"還可以取得更多的資訊(如下圖),補全給他按下去慢慢選就好,真的都要記下來太累了



取得裝置名稱
android.os.Build.DEVICE

在"android.os.Build"這裡面還有很多參數,以我這腦容量超小的狀況下還是使用補全慢慢挑慢慢選就好


或者可以從"android.os"這裡面也有很多資訊可以取得

可以再搭配前幾篇的"Android get sdk version & app version 取得版本資訊"、"Android 取得畫面解析度"來取得所需的資訊,站在廠商的角度真的要感謝google,感謝facebook,讓我們可以取得更完整的用戶資訊來作分析改善,以便找出淺在用戶。

相關連結
Android Developers
Android Developers - TelephonyManager
Android Developers - Build
Android Developers - android.os

Android get sdk version & app version 取得版本資訊

UI設定在某些狀況下會產生位置錯亂,並不是因為解析度問題,真的是因為版本對於該參數所定義上有修改。

一般來說直接判斷sdk version應該是比較方便,app version可以用在顯示目前app版本的地方,讓使用者知道當前版本。
//sdk verson
String sdkName = Build.VERSION.RELEASE;
String sdkVerson = Build.VERSION.SDK;
System.out.println("sdkName = "+sdkName+" || sdkVersion = "+sdkVerson);
//sdkName = 2.1-update_1 || sdkVersion = 7


//app verson
try {
String versionName = getPackageManager().getPackageInfo(getPackageName(), 0).versionName;
int versionCode = getPackageManager().getPackageInfo(getPackageName(), 0).versionCode;
System.out.println("name = "+versionName+" || code = "+versionCode);
} catch (NameNotFoundException e) {
//Handle exception
}


相關連結
Android developers
Android developers - Build.VERSION

Android 取得畫面解析度

取得畫面解析後才方便修改UI的比例來作調整,修改UI大小的方式在前一篇"Android setWidth setHeight 設定UI寬高"當中有提到,就可以配合著取得畫面解析度來作調整。

screenWidth就是螢幕的寬,screenHeight就是螢幕的高,所call的getScreenScaleType就是取得畫面比例
Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
String scapeType = getScreenScaleType(screenWidth, screenHeight);
System.out.println("scapeType = "+scapeType);

//getScreenScaleType
public String getScreenScaleType(int width, int height){
String scaleType = "unknow";
float scale = (float) 0.0;
boolean landspace = false;

if(width > height){
landspace = true;
}else{
landspace = false;
}

if(landspace == true){
scale = (float)width/(float)height;
}else{
scale = (float)height/(float)width;
}
// System.out.println("width = "+width+" || height = "+height+" || scaleType = "+scaleType);

if(scale >= 1.76 && scale <= 1.8){ //WVGA800 or WQVGA432 if(landspace == true && width == 432){ scaleType = "WQVGA432landspace"; }else if(landspace == true && width == 854){ scaleType = "WQVGA854landspace"; }else if(landspace == false && height == 432){ scaleType = "WQVGA432"; }else if(landspace == false && height == 854){ scaleType = "WQVGA854"; }else{ scaleType = "5:8"; } }else if(scale >= 1.66 && scale <= 1.78){ //WVGA800 or QWVGA400 if(landspace == true && width == 400){ scaleType = "QWVGA400landspace"; }else if(landspace == true && width == 800){ scaleType = "WVGA800landspace"; }else if(landspace == false && height == 400){ scaleType = "QWVGA400"; }else if(landspace == false && height == 400){ scaleType = "WVGA800"; }else{ scaleType = "3:5"; } }else if(scale == 1.5){ //HVGA if(landspace == true && width == 480){ scaleType = "HVGAlandspace"; }else if(landspace == false && height == 480){ scaleType = "HVGA"; }else{ scaleType = "2:3"; } }else if(scale >= 1.3 && scale <= 1.4){ //QVGA if(landspace == true && width == 320){ scaleType = "QVGAlandspace"; }else if(landspace == false && height == 480){ scaleType = "QVGA"; }else{ scaleType = "3:4"; } } System.out.println("width = "+width+" || height = "+height+" || scaleType = "+scaleType); return scaleType; }


不過在解析度這部份還是有個地方不太了解,由於我也沒有手機可以來作實測沒辦法了解到詳細狀況,目前在emulator裡面看到的狀況如下
HVGA =>320*480(width*height) || 實測取得為 320*480(width*height)
QVGA =>240*320(width*height) || 實測取得為 320*427(width*height)
WQVGA400 =>240*400(width*height) || 實測取得為 320*533(width*height)
WQVGA432 =>240*432(width*height) || 實測取得為 320*480(width*height)
WVGA800 =>480*800(width*height) || 實測取得為 320*533(width*height)
WVGA854 =>480*854(width*height) || 實測取得為 320*569(width*height)

紅色的部份為實測時發現不同的部份,不過目前也沒有這麼多的device來確認究竟是哪邊的問題,好消息是如果真的都與實測相同那解析度在寬的部份都是相同的(皆為320),歸類起來高也只有4種(427, 480, 533, 569),在device上面目前只有看到320*427(HTC Wildfire)、320*480(HTC hero)、320*533(HTC Desire)是比較確定的,其他的...除非有人願意借我測看看吧。

相關連結
Android Developers
Android Developers - Activity
Android setWidth setHeight 設定UI寬高

Android setWidth setHeight 設定UI寬高

Android的裝置上解析度真的太多了,尤其在2.1以前跟2.2以後的margin定義方式也不同,所以在runtime狀況下能動態的改變layout是個最好的方式,但是在weight裡面有個屬性為"setWidth"、"setHeight"實際上設定下去weight卻不一定會跟著改變,只要有個地方發生問題就會整個掛掉,小則畫面變黑一下子,重責直接重開機。可以配合另一篇"Android 取得畫面解析度"來作更完善的調整。

現在就以一個按鈕為例,在xml中設定寬高方式如下
其中"wrap_content"就是照你按鈕內容改變大小,"fill_parent"就是直接佈滿,當然也可以直接以"100px"(100像素)這種方式直接給予固定的大小
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content">



在runtime中要給予大小,就以上面那button為例,在Activity中的onCreate內加上下面這段
Button myButton = (Button)findViewById(R.id.button);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100, 100);
myButton.setLayoutParams(params);


直接給予他一個layout的方式來修改就可以順利改變,或者可以採用下面這種方式(兩種效果相同)
Button myButton = (Button)findViewById(R.id.button);
myButton.getLayoutParams().width=150;
myButton.getLayoutParams().height=150;



相關連結
Android Developers
Android Developers - LinearLayout.LayoutParams
Android 取得畫面解析度