小目睭的靈伊世界
有關專案開發 android java的學習紀錄
2015年7月2日
2014年5月21日
Android─呼叫wifi setting 頁面
趕快記錄一下,以免以後要用的時候忘記
Intent i = new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK); startActivity(i);
Android─設定String的樣式好工具 SpannableString
當我們在開發APP時,有時候為了讓UI的顯示豐富性,我們可能在一個String的顯示上,會有
不同的配置
例如:字體的顏色、大小、粗細
又或者是String內的部分內容有 電話號碼 Email帳號
我們又希望點選他可以呼叫對應的應用程式
Android提供了SpannableString這個API可以讓我們達到上述的功能
程式碼如下:
版面配置:
orignaltext TextView 顯示原始的字串
changetext TextView 顯示經過SpannableString設定的字串內容
String.xml內容如下
主要程式碼:
顯示內容:
不同的配置
例如:字體的顏色、大小、粗細
又或者是String內的部分內容有 電話號碼 Email帳號
我們又希望點選他可以呼叫對應的應用程式
Android提供了SpannableString這個API可以讓我們達到上述的功能
程式碼如下:
版面配置:
orignaltext TextView 顯示原始的字串
changetext TextView 顯示經過SpannableString設定的字串內容
String.xml內容如下
Test_SpannableString Settings Hello world! I am normal word\n I am small word\n I am big word\n my phone number:\n033272345\n my email accout:\nkkk@quantatw.com\n my website:\nwww.quantatw.com\n
主要程式碼:
public class SpannableStringfordemo extends Activity {
TextView organlTextView = null;
TextView changeTextView= null;
SpannableString editstring = null;
String mixstring;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_spannable_stringfordemo);
organlTextView=(TextView)findViewById(R.id.orignaltext);
changeTextView=(TextView)findViewById(R.id.changetext);
mixstring=(String)this.getResources().getText(R.string.small_word) + (String)this.getResources().getText(R.string.normal_word)+(String)this.getResources().getText(R.string.big_word)+(String)this.getResources().getText(R.string.myphonenum)+(String)this.getResources().getText(R.string.myemail)+(String)this.getResources().getText(R.string.myweb);
organlTextView.setText(mixstring);
editstring = new SpannableString(mixstring);
//size the font size
editstring.setSpan(new RelativeSizeSpan(0.5f), 0, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //0.5f mean the half default size
editstring.setSpan(new RelativeSizeSpan(2.0f), 32, 46, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //2.0f mean the double default size
editstring.setSpan(new URLSpan("tel:033272345"), 64, 73, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //deal the number
editstring.setSpan(new URLSpan("mailto:kkk@quantatw.com"), 90, 107, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //send the mail
editstring.setSpan(new URLSpan("http://www.quantatw.com"), 119, 136, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //open the website
changeTextView.setText(editstring);
changeTextView.setMovementMethod(LinkMovementMethod.getInstance()); //when click intent the app
}
}
顯示內容:
其實SpannableString還可以對String做更多的變化
大家可以參考此網站,敘述的蠻詳細的
2014年4月21日
2014年4月14日
Android─取得APP資料大小
![]() |
| YouTube實際存在儲存空間大小 |
如果我們想要自己開發一個類似的程式,透過PackageManager我們只能得到APK的SIZE,卻無法得知data size與 cache size。
上網搜尋相關的資訊,找到Android裡有一個class可以取得相關的資訊
android.content.pm.PackageStats
參考連結
但是在SDK裡面並沒有開放此方法可以使用,只有系統有調用的權限
我們並沒有使用的呼叫的權限
此時我們可以透過 Java的Reflection機制,來呼叫隱藏的API
觀看詳細請點此
待整理資料
參考連結
參考連結2
參考連結3
參考連結4
2014年3月21日
Android─如何ping網頁
因為程式需求,想要知道手機目前的wifi連線是否有連接外網的能力
所以求助google大神,結果找到了一行程式碼,就可以判斷網路是否有連外能力
參考連結
程式碼如下
但在後來測試的結果發現,不論wifi是否有對外連線能力,都會回傳false
所以又馬上求助google大神,看問題是出在哪邊
發現網路上有很多人跟遇到跟我一樣的問題
程式碼雖然精簡,但不能正常運作,所以只好退而求其次
找尋是否能有在Android程式下執行ping指令
我找到的程式碼如下
參考連結
在有連外網路的狀況下的確會回傳0,但在ping不到的情況下,thread會在那一直等待ping的結果
於是我又要求助google大神,結果發現了兩種解法
所以求助google大神,結果找到了一行程式碼,就可以判斷網路是否有連外能力
參考連結
程式碼如下
if (InetAddress.getByName("www.google.com.tw").isReachable(5000))
上述程式是看能否在五秒內連結 www.google.com.tw,如果連接上回傳true,反之回傳false但在後來測試的結果發現,不論wifi是否有對外連線能力,都會回傳false
所以又馬上求助google大神,看問題是出在哪邊
發現網路上有很多人跟遇到跟我一樣的問題
程式碼雖然精簡,但不能正常運作,所以只好退而求其次
找尋是否能有在Android程式下執行ping指令
我找到的程式碼如下
參考連結
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = p1.waitFor();
boolean reachable = (returnVal==0);
上述程式碼,是對www.google.com.tw ping 一次,如果ping成功會回傳0,失敗會回傳-1在有連外網路的狀況下的確會回傳0,但在ping不到的情況下,thread會在那一直等待ping的結果
於是我又要求助google大神,結果發現了兩種解法
- 設定 ping的參數
- 對執行 Process做的動作執行timeout的機制
//-c 是指ping的次數 3是指ping 3次 ,-w 100 w是以秒為單位的間隔時間,100是指timeout 100秒
Process p1 = Runtime.getRuntime().exec("ping -c 3 -w 100 " + str);
參考連結
public static int timeoutInSeconds=5;
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int retrunVal;
//取得目前系統時間
long now = System.currentTimeMillis();
//timeout時間為5秒
long timeoutInMillis = 1000L * timeoutInSeconds;
long finish = now + timeoutInMillis;
//當p1 alive及timeout還沒發生時,繼續在迴圈中
while ( isAlive( p1 ) && ( System.currentTimeMillis() < finish ) )
{
Thread.sleep( 10 );
}
public static boolean isAlive( Process p ) {
try
{
//p結束的值
p.exitValue();
return false;
} catch (IllegalThreadStateException e) {
return true;
}
}
上述的程式碼是透過process是否已經取得值加上timeout的機制 來判斷是否真的有ping到網頁 當呼叫isAlive時,會去偵測p是否結束並且有回傳值,如果沒有值發生exception回傳true while迴圈則利用isAlive及時間是否超過timeout時間,來判斷是否取得ping值
參考連結2014年3月20日
Android ─ Handler sendMessage 與 sendToTargett差異
最近在上網找有關Handler相關資訊的時候
發現了,要發送的Message實體化的方式卻有兩種
都有callback的功用
但是兩者對於程式的資源消耗卻有差別
所以採用的obtainMessage來實體化message會是比較有效率的方法
參考連結
參考連結
發現了,要發送的Message實體化的方式卻有兩種
- 如果使用sendMessage方式
程式碼如下:
Message msg=new Message(); msg.arg1=i; handler.sendMessage(msg);
- 使用sendToTarget方式
程式碼如下:上次兩種方式都可以達到相同的目的,將訊息回傳給handler去做後續的處理
Message msg = handler.obtainMessage(); msg.arg1 = i; msg.sendToTarget();
都有callback的功用
但是兩者對於程式的資源消耗卻有差別
- 使用sendMessage,我們需要自己new Message,來取得message
如此會增加prcoess的儲存空間 - 使用sendToTarget,採用obtainMessage()方法來取得message,是從系統的MessagePool中取得,並不會增加process的儲存空間
所以採用的obtainMessage來實體化message會是比較有效率的方法
參考連結
參考連結
訂閱:
意見 (Atom)


