2016年6月27日 星期一

[轉][Android]禁止旋轉螢幕時重新載入畫面(Don't reload, when rotate device)

Activity在執行時,可以直向或橫向顯示,當旋轉螢幕時,系統會自動做翻轉的動作。這在沒有載入資料的Activity中是沒問題的,但若有些資料是從網路下載下來,當旋轉螢幕時,會全部重新執行一次,因為Android對旋轉的做法是,把原先的Activity給Destroy掉,然後再Create一個新的不同方向的Activity。


如果不想讓Activity在旋轉螢幕時被自動轉向,可以在AndroidManifest.xml中設定Activity的屬性:
  • android:screenOrientation="portrait" (指定為直向)
  • android:configChanges="keyboard|keyboardHidden|orientation" (告訴系統,我要自己處理轉向問題)
android:configChanges="keyboard|keyboardHidden|orientation" 
android:screenOrientation="portrait">
原本我以為只要指定configChanges="orientation"來處理轉向就好,但不能單只有這個,還必須加上keyboard及keyboardHidden這兩個當螢幕鍵盤出現的時候也要處理,才能正常執行。

如此你可以在Activity的onConfigurationChanged方法中自己處理螢幕旋時要如何處理。

以下會做兩個測試,一個是有鎖定螢幕方向,一個沒有。

測試的程式碼:
public class RotationDeviceDemoActivity extends Activity {

    private final String TAG = "==DEMO==";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.d(TAG, "onCreate");
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "onConfigurationChanged");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "onRestoreInstanceState");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "onSaveInstanceState");
    }
}

測試1:當Activity沒有設定configChanges及screenOrientation時(無鎖定螢幕方向)

執行結果:

523: D/==DEMO==(227): onCreate <===第一次開啟Activity
823: D/==DEMO==(227): onSaveInstanceState <===旋轉螢幕時可讓你儲存狀態
823: D/==DEMO==(227): onDestroy <===接著銷毀Activity
883: D/==DEMO==(227): onCreate <===然後從新建立一個新的已轉向的Activity
883: D/==DEMO==(227): onRestoreInstanceState <===並且可讓你取回剛才存下來的狀態

測試2:有設定configChanges及screenOrientation(鎖定螢幕方向)

執行結果:

184: D/==DEMO==(324): onCreate <===第一次開啟Activity
074: D/==DEMO==(324): onConfigurationChanged <===旋轉螢幕
554: D/==DEMO==(324): onConfigurationChanged <===再轉一次

你會發現,Activity這時不會儲存狀態及銷毀,它只會執行onConfigurationChanged,不管你轉幾次方向,都只會觸發這方法。你可以自行在這裡指定不同的layout佈局,或什麼都不做。
本文網址:http://blog.tonycube.com/2011/10/dont-reload-when-rotate-device.html

2015年12月4日 星期五

[Android][Adb]How to Capture Screenshot and Record Screen using ADB

1. Install the required ADB drivers on your PC.
2. Connect your device with PC using wired or wireless ADB connection.
3. Open Terminal in Linux or Command Prompt and enter the following command.
% adb shell screencap -p /sdcard/screencap.png
4. Now the captured screenshot will be placed on your internal sdcard. To copy the screenshot to your pc enter the command.
% adb pull /sdcard/screencap.png
Recording Screen
1. Connect your device with PC using wired or wireless ADB connection.
2. Open Terminal in Linux or Command Prompt and enter the following command.
% adb shell screenrecord /sdcard/screen.mp4
3. To stop screen recording break using Ctrl + C
4. Now the captured video will be placed in internal sdcard. Copy the video to PC using the command.
% adb pull /sdcard/screen.mp4
5. Increase bitrate of the video using the command.
adb shell screenrecord –bit-rate 12000000 /sdcard/screen.mp4

2015年11月15日 星期日

[Android]android常用控件

在 Android 中使用各種控件(View)

  • DatePicker - 日期選擇控件
  • TimePicker - 時間選擇控件
  • ToggleButton - 雙狀態按鈕控件
  • EditText - 可編輯文本控件
  • ProgressBar - 進度條控件
  • SeekBar - 可拖動的進度條控件
  • AutoCompleteTextView - 支持自動完成功能的可編輯文本控件
  • MultiAutoCompleteTextView - 支持自動完成功能的可編輯文本控件,允許輸入多值(多值之間會自動地用指定的分隔符分開)
  • ZoomControls - 放大/縮小按鈕控件
  • Include - 整合控件
  • VideoView - 視頻播放控件
  • WebView - 瀏覽器控件
  • RatingBar - 評分控件
  • Tab - 選項卡控件
  • Spinner - 下拉框控件
  • Chronometer - 計時器控件
  • ScrollView - 滾動條控件
在Android中使用的Layout
FrameLayout:裏面只可以有一個控件,並且不能設計這個控件的位置,控件會放到左上角
LinearLayout:裏面可以放多個控件,但是一行只能放一個控件
TableLayout:這個要和TableRow配合使用,很像html裏面的table
AbsoluteLayout:裏面可以放多個控件,並且可以自己定義控件的x,y的位置
RelativeLayout:裏面可以放多個控件,不過控件的位置都是相對位置
(Android界面布局好像還可以直接引用一些view,如ScrollView等)

常用控件:



1,EditText
     主要函數:setText/getText設置/獲取文本內容,setHint設置缺省顯示內容;

2,RadioGroup,RadioButton
RadioButton的isChecked()判斷是否被選中
獲取選中RadioButon的ID:設置RadioGroup.setOnCheckedChangeListener方法
public onCheckedChanged(RadioGroup group,int checkedId)//checkedId是選中RadioButton的ID

3,CheckBox
isChecked()判斷是否被選中
setOnCheckedChangeListener方法監視選中狀態改變情況

4,Spinner
    a,顯示數據
1),硬編碼加載
通過setAdapter方法設置類型為ArrayAdapter (Context context, int textViewResId, String []objects)
   textViewResourceId:顯示內容的ViewID默認設置為R.layout.simple_spinner_item
   objects:顯示的內容
2),從資源文件中加載
ArrayAdapter.createFromResource (Context context, int textArrayResId, int textViewResId) //textArrayResId是資源ID
返回ArrayAdapter
    b,設置下拉列表的風格(可選)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    c,監聽選項選擇變更事件
setOnItemSelectedListener設置監聽去
Spinner.OnItemSelectedListener類須實現以下兩個方法

public void onItemSelected (AdapterView parent, View view, int position, long id)//view 選中項實例,position選擇項在adapter中的位置
public void onNothingSelected(AdapterView arg0)
    d,設置選中項
Spinner.setSelection(position)//索引從0開始
    d,獲取選中項
getSelectedItemPosition ()
getSelectedItem () //該值toString()則為選中內容的字符串
getSelectedItemId ()
getSelectedView ()

5,AutoCompleteTextView
1,setAdapter設置數據adapter
2,設置輸入多少個字符顯示提示AutoCompleteTextView.setThreshold(int threshold)
6,MultiAutoCompleteTextView (允許輸入多值,多值之間會自動地用指定的分隔符分開)
1,setAdapter設置數據adapter
2,setTokenizer設置提示Tokenizer缺省的為new MultiAutoCompleteTextView.CommaTokenizer()以逗號分隔

7,DatePicker,TimePicker
a,DatePicker
1),設置初始顯示日期init(int Year, int month, int day, new DatePicker.OnDateChangedListener(){
    public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth){}
   })
2),獲取設置值 getYeah()/getMonth()/getDayOfMonth()
b,TimePicker
1),設置setCurrentHour (Integer currentHour) /setCurrentMinuter (Integer currentHour)
2,setIs24HourView(Boolean)設置是否為24小時制顯示
3,監聽設置改變setOnTimeChangedListener
c,獲取系統當期時間和日期
Calendar.getInstance()返回Calendar
Calendar.get (int field) ---field 可以為Calendar.YEAR/ Calendar.MONTH/ Calendar.DAY_OF_MONTH/ Calendar.HOUR_OF_DAY/ Calendar.MINUTE

8,ImageView/ImageButton
主要方法
setImageResource 設置顯示圖片
setAlpha 設置Alpha
invalidate 強制更新
setScaleType( ScaleType st) 設置圖片顯示方式,st是一枚舉
setAdjustViewBounds 設置是否調整控件適應圖片大小
setBackgroundResource 設置背景

9,ImageSwitcher(顯示一系列的圖片,但當前只顯示一張圖片)
     顯示數據
setFactory( ViewSwitcher.ViewFactory factory)設置要顯示的數據
,ViewFactory接口須實現方法public View makeView(){}負責提供當前顯示的視圖(ImageView),且View必須為新實例
     方法
setImageResource設置當前顯示的圖片
getCurrentView()返回當前顯示的視圖
setInAnimation(Animation ani)設置視圖裝載入時的動畫效果,AnimationUtils.loadAnimation(Context context, int id) 獲取動畫效果android.R.anim.XX
setOutAnimation(Animation ani)設置視圖裝載入時的動畫效果


10,Gallery(顯示一系列的圖片,提供拖動等特效)
     顯示數據
setAdapter(SpinnerAdapter adapter)設置數據適配器.
   數據適配器可以繼承自BaseAdapter,該類 public View getView(int position, View convertView, ViewGroup parent) 返回當前選擇的視圖(ImageView)
     選項選中監聽setOnItemSelectedListener

11,GridView(表格顯示一系列圖片)
     顯示數據
setAdapter(ListAdapter adapter)設置數據適配器.
   數據適配器可以繼承自BaseAdapter,該類 public View getView(int position, View convertView, ViewGroup parent) 返回當前選擇的視圖(ImageView)
     選項選中監聽setOnItemSelectedListener
     getSelectedView()返回當前選中的視圖

12,ScrollView

13,ProgressBar
setIndeterminate 設置進度條是否自動運轉
setProgressStyle 設置顯示風格.ProgressDialog.STYLE_HORIZONTAL/ProgressDialog.STYLE_SPINNER
setProgress 設置進度
setMax 設置最大值
getProgress()獲取當前進度

14,SeekBar
方法
setMax 設置最大值
getProgress()獲取當前值
setProgress 設置值
setIndeterminate
監聽器
setOnSeekBarChangeListener其下有三個方法
   public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) //數值變更,arg1新值,是否Touch
   public void onStartTrackingTouch(SeekBar seekBar)//開始拖動
   public void onStopTrackingTouch(SeekBar seekBar) //結束拖動

15,ListView
      a,顯示數據setAdapter(ListAdapter adapter)
       adapter可為new SimpleCursorAdapter/SimpleAdapter(Context context, int layout, Cursor c, String[] from, int[] to)
       layout 用來顯示數據的模板.顯示一列可用android.R.layout.simple_list_item_1 兩列可用android.R.layout.simple_list_item_2
               多列則需要自己實現xml視圖布局文件
       c   數據(可用ArrayList構造數據)
       from ':
       to 用來顯示對應列的空件id
      b,動態增刪數據
        adapter.notifyDataSetChanged()
      d,設置背景色
        setBackGroudRource

2015年10月17日 星期六

[Git]Git常用指令

Git常用指令

medium_3340416618
由於Git太多東西可以學了,以下這些指令都是很基本的,最常用的,給大家參考:

branch

git branch #查看目前有那些local branch
git branch branch-name #開local branch
git branch -r #查看所有遠端repo的branch
git branch -d #刪除local branch
git branch -D #強制刪除local branch
git push origin :branch-name #刪除遠端branch
push/pull
git pull  #將所有遠端的更動都拉下來
git push  #將本地所有的commit都推到遠端
git pull origin master/branch #只將該master/branch的變動拉下來
git push origin master/branch #將本端的commit推到遠端的master/branch
checkout
git checkout file-name #將該檔案從在working tree中已經變動的狀態下,拉回至未變動狀態下。
git checkout branch-name #切換到該branch
commit/add
git commit file-name #將file-name commit出去
git commit file-name -m ‘註解’ #將file-name commit ,必且直接寫註解在後面
git add file-name #新增一個untracked file
git add .#新增所有的untracked file
git commit add -m ‘註解’ #將所有變動同時commit add 以及下註解
diff
git diff file-name #查看該檔案修改後有哪些變動
git diff HEAD #查看目前所在位置與repository的差異
show
git show commit #查看給定的commit有何變動
stash
git stash #丟進站存區
git stash pop #拉出暫存區
git stash clear #清空暫存區
reset
git reset commits –hard #回復到該commits之前的狀態,修改過的檔案全部從staging跟working tree中刪除
git reset #將你已經add進staging裡的變動拉回至unstage狀態,但該檔案變動還留在working tree
git reset commits –soft #回復至該commits之前的狀態,但修改過得檔案還留在staging中
註:如果你是下git reset commits –hard , 它的功能會像是git reset commits –soft -> git reset ->git checkout file-name,因為–hard是將你的branch回復到該commits之前,且 所有變動全部從staging跟working tree刪除,而–soft先回復至該commits之前,但檔案都還留在staging , 而reset再將檔案從staging拉回至working tree , checkout則將working tree的變動回復至未變動狀態下,所以這兩者基本上是一樣的。
merge
git cherry-pick hash-number #將某個commit merge
git merge branch-name #合併另一個branch
rm/mv
git rm file-name #刪除該檔案
git mv file-name new-file-name #重新命名該檔案,搬移檔案
others
git status #查看現在狀態,是否有untracked file 或未被commmit的檔案
git log #查看所有commit
git blame file-name #查看誰修改過此檔案
git clone remote-address #將遠端的repo複製一份到local

[Git]使用 format-patch 將 commit 打包成檔案 Use format-patch to carry commit

Git 是一套很棒的版本控制軟體


在協同作業的時候,有時候會需要將別人的 commit 抓來自己的 branch

或者是將自己的 commit 打包給別人

此時就要用到 format-patch 這個好用的指令
  • 打包:
% git format-patch -n
  • 套用:
git am xxx.patch

舉例來說

1.如果我們今天要打包最新的三個 commit 的話

 % git format-patch -3

此時 git 便會幫你產生3個類似下列的檔案

0001-First.patch

0002-Second.patch

0003-Third.patch

2.那如果要套用別人的patch 也相當簡單

  %git am 0001-First.patch 

就將 patch apply 上去了

2015年10月11日 星期日

[GPS]輔助式全球衛星定位系統(AGPS:Assisted GPS)

輔助式全球衛星定位系統的定義

由於GPS系統的衛星距離地球表面大約20000公里,傳送到地面的訊號微弱,所以一般地面的接收器開機以後大約需要30秒的時間才能計算出位置,科學家開始試著尋找能夠縮短定位時間,並且增加定位精確度的方法,稱為「輔助式全球衛星定位系統(AGPS:Assisted GPS)」。

行動定位系統

其實除了GPS系統可以提供定位的功能,由於手機必須在某一個細胞的基地台通訊範圍內才能通訊,所以我們也可以利用基地台協助手機定位,由於美國聯邦通訊委員會(FCC)規定美國的系統業者必須提供手機行動定位服務,以確保手機的使用者發生緊急事件的時候,救難人員能夠知道使用者的正確位置,所以各家系統業者開始發展行動定位系統,目前常見的包括:
>CI/CSI技術(Cell-ID/Cell-Sector Identification):利用行動電話細胞識別碼與手機所在的細胞位置來進行定位,在都會區由於人口密集,細胞較小,定位精確度大約數百公尺;在郊區由於人口較少,細胞較大,定位精確度大約數十公里。
>AOA技術(Angle of Arrival):利用手機與基地台的方位角計算位置來進行定位,並且透過方向性天線與兩個以上的基地台判斷手機的位置。
>TOA/TDOA技術(Time of Arrival/Time Difference of Arrival):利用三個以上的基地台傳送到手機的訊號時間延遲,來計算手機與基地台的距離而判斷手機的位置,每個基地台必須加裝位置測量單元(LMU:Location Measure Unit),成本較高,TOA的定位精準確大約200公尺,TDOA大約100公尺。
>EOTD(Enhanced Observed Time Difference):利用三個以上的基地台接收到手機的訊號,再傳送給最近的位置測量單元(LMU),這樣一來數個基地台只要加裝一個位置測量單元(LMU)即可,成本較低,定位精確度大約100公尺

輔助式全球衛星定位系統(AGPS:Assisted GPS)

在所有行動定位技術中,AGPS系統是精確度最高的一種,但是手機必須具有GPS接收器,由於GPS必須接收微弱的衛星訊號,所以天線模組比較大,會使手機的尺寸變大,手機的價格也比較高。AGPS系統是由手機先利用所在細胞位置的基地台來進行定位,由於基地台的位置固定(已知),這個時候再利用手機內的GPS接收器搜尋附近位置的GPS衛星即可快速定位,開機以後大約只需要10秒以內就能夠計算出位置,而且精確度更高。

GPS overview

GPS (Global Position System, 全球衛星定位系統)最早是美國軍方所建置用來協助戰略武器能夠精準的定位其攻擊目標的位置。在目標物的定位主要是透過太空中的衛星來定位,此種方式可以有效避免衛星不容易被敵方摧毀。後來美國軍方也將部份GPS的技術或資源移轉給民間作為商業化的應用,而慢慢演變成今日的GPS系統。下圖為GPS全球衛星位於地球外太空中的示意動畫圖 (可以點選此圖另開視窗觀看動畫圖,本圖參考於此網站),一般來說至少有24顆衛星分布在6個軌道上運行,在地球的表面上正常至少能夠接收到6顆衛星的訊號,而能夠正確的定位出目標物的位置 (包含經緯度、高度以及時間)則至少需要4顆衛星訊號來協助交叉定位。扣除天氣狀況以及建築物遮蔽等外在因素外,GPS裝置的訊號接收靈敏度關係到GPS定位的準確定以及定位時間的長短。
 
 
     早期GPS常見的商業化應用大多是所謂的行車導航機或者是隨身攜帶的GPS定位記錄器,近年來隨著智慧型手機的快速發展再加上網路線上地圖的方便使用,GPS也變成智慧型手機的基本功能之一。現在在外頭只要拿起手機開啟GPS功能,就能夠輕鬆的定位出所在的位置,同時配合軟體還能夠快速搜尋出如何到達目的地或者是列出附近的加油站、便利超商等商店,已經不太需要像以前一樣需要帶一本厚重的地圖集出門了。下面我們將簡單介紹在使用GPS時會需要知道的幾個效能參數,在了解這些參數背後所代表的意義之後相信可以幫助我們更加的了解GPS系統應用。
 
1. TTFF (Time To First Fix): 其定義為在冷開機 (Cold Start)的狀態下到GPS第一次定位成功所需要的時間,正常來說所需的時間應該越少越好。不過目前來講,TTFF的時間大多在50~80秒之間算是一個基本的要求,而目前的智慧型手機在組裝出廠時都是藉由驗證其TTFF時間來確保手機GPS功能維持正常。
2. Cold Start (冷開機): 當GPS裝置先前定位資料已經許久未更新 (或是第一次使用)的情況下,包含衛星星曆資料 (Ephemeris Data)、定位時間及最後的位置都已經改變的狀況之下,此時開啟GPS服務時會進行所謂的冷開機,同時冷開機完成的定位時間是最長的。
3. Warm Start (暖開機): 在GPS裝置依然保有最近粗略的定位資料之下,僅是針對詳細的定位資訊再做一次更新即可完成定位,其定位時間介於冷開機及熱開機之間。
4. Hot Start (熱開機): 距離之前的GPS定位紀錄完成的時間相當接近,同時僅是將GPS系統做重新開啟的動作,此時GPS僅需要相當短的時間即可完成定位(~1秒)。

Reference:
https://sites.google.com/site/changch1011/my-blog/GPS-and-GPS-Antenna-Design