可列舉執行工作(Task)&服務(Service)的Android工作管理員

本文是Google Android應用程式範例實務課程-Day5課堂作業,說明如下。

[範例情境]
1.Android缺少工作管理員,無法得知背景有哪些程式正在執行
2.請撰寫可捕捉系統執行工作(Task)&服務(Service)資訊的程式

[情境分析]
1.1個Activity
2.1個Layout


SETP 1:新建專案


SETP 2:修改AndroidMainfest.xml


SETP 3:配置Layout
﹡主畫面main.xml之配置
  1. 加入Button,之後會透過觸發Click event取得系統執行之工作與服務
  2. 加入2個ListView,之後會用來分別呈現取得之執行工作、執行服務資訊

﹡用來裝載ListView之piggy_simple_list_item.xml配置
  1. 有別於前面的配置UI,這裡是描述ListView的外觀

  ps:若懶得新增piggy_simple_list_item.xml,也可使用Android預設之ListView樣式,在SETP 4撰寫程式碼時,指向android.R.layout.simple_list_item_1即可


SETP 4:撰寫程式碼
package com.example.android.homework8; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityManager.RunningServiceInfo; import android.os.Bundle; import android.view.View; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.ListView; public class Homework8 extends Activity { private Button bt1; private ListView mListView01; private ListView mListView02; private ArrayAdapter aryAdapter1,aryAdapter2; /*Task*/ private ArrayListarylistService; private int intGetTaskServiceCounter=30; public List mRunningTasks; private ActivityManager mActivityManager; /*Service*/ private ArrayListarylistTask; private int intGetTaskCounter=30; public List mRunningTaskServices; //private ActivityManager mActivityManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bt1 = (Button)findViewById(R.id.Button01); mListView01 = (ListView)findViewById(R.id.ListView01); mListView02 = (ListView)findViewById(R.id.ListView02); bt1.setOnClickListener(new Button.OnClickListener(){ @Override public void onClick(View v) { mActivityManager = (ActivityManager)Homework8.this.getSystemService(ACTIVITY_SERVICE);//取得工作和服務都用同一個ActivityManager /*取得執行工作資訊*/ arylistTask = new ArrayList(); mRunningTasks = mActivityManager.getRunningTasks(intGetTaskCounter); int i = 1; /* 以迴圈及baseActivity方式取得工作名稱與ID */ for (ActivityManager.RunningTaskInfo amTask : mRunningTasks) arylistTask.add("" + (i++) + ": "+ amTask.baseActivity.getClassName() + "(ID=" + amTask.id +")"); aryAdapter1 = new ArrayAdapter(Homework8.this, R.layout.piggy_simple_list_item, arylistTask); mListView01.setAdapter(aryAdapter1); /*取得執行服務資訊*/ arylistService = new ArrayList(); mRunningTaskServices = mActivityManager.getRunningServices(intGetTaskServiceCounter); int j = 1; /* 以迴圈及RunningServiceInfo物件取得服務名稱與ID */ for (RunningServiceInfo amTask : mRunningTaskServices) arylistService.add("" + (j++) + ": "+ amTask.process + "(ID=" + amTask.pid +")"); aryAdapter2 = new ArrayAdapter(Homework8.this, R.layout.piggy_simple_list_item, arylistService); mListView02.setAdapter(aryAdapter2); } }); } }

SETP 5:執行
初始畫面
為區別執行工作&之執行服務資訊,分別使用藍色&紅色ListView呈現,而本例運行時並無其他專案在run,所以無論是工作或服務都只抓到Homework8自己,如果有運行其他AP,也是可以一併抓取的喔!
成功執行之畫面

Google Android應用程式範例實務課程-Day5

倒數第2堂課踏入Android重頭戲「Service」,切入正題前David提出學員常問之問題「網頁在Android中要如何避免被爬行」,預防方式有二種建議:
1. NGIX:NGIX是免費的,其特色在於可固定request   /by host,  by  IPAddress
2. 透過防火牆亦可,如知名的CERTIX

接下來是今日課程重點嚕0.<

﹡有別於微軟Windows,Linux OS一開機就把所有資源分配給Instance。

﹡Activity無須覆寫任何方法即可執行,但Service一定要覆寫onBind。
 ps:記得把AndroidManifest.xml中的Activity改成Service的描述

﹡Service在AndroidManifest.xml有哪些屬性可參考Android developers,此處列舉3個較重要:
  1. android:name="string" →ClassName
  2. android:exported="true | false"  →表示Service可否被j其他程式存取
  3. android:process="string"

﹡Service在AndroidManifest.xml的位置,一定要在Activity之後以及Application之前

﹡Emulator Control提供三類測試:打電話、發簡訊、定位

﹡自行撰寫的鬧鐘AP不比權限為root的SystemAlarm,只要關機就會被清空,必須使用AlarmManager搭配BOOT_COMPLETED設計

﹡要撰寫能確實和用戶互動的AP,Broadcast與BroadcastReceiver不可不懂!透過他們可以佇列接聽所需的資訊,以進行後續處理。

﹡Receiver不會GC,使用完畢請務必Unregister

﹡各類按鍵event中,唯獨HOME與Hand-off無法捕捉來覆寫

﹡ACTION_SHUTDOWN已列為Deprecated

﹡影音的處理並非Android重點,技術尚不及iPhone,例如觀看網路上的影音串流,iPhone會考量用戶頻寬作Buffer處理使影片播放順暢


SERVICE是Android中超重要一環,但今日教得有點快捏T=T

★課堂作業
1. 可列舉執行工作(Task)&服務(Service)的Android工作管理員

內嵌網頁JavaScript與Activity互動,以撥打電話為例@Android

本文是Google Android應用程式範例實務課程-Day4課堂作業,說明如下。

由前二篇文章知如何於Android環境鑲嵌並瀏覽網頁,本文進一步讓內嵌網頁與Android互動。請參考:
1. 以WebViewClient於Android開啟網頁,並以AlertDialog提示載入狀態
2. 攔截onKeyDown使BACK按鍵運行WebViewClient之goBack,而非結束Activity


[範例情境]
1.透過Android的WebViewClient包裝網頁
2.點選網頁中的超連結要能自動撥打電話

[情境分析]
1.1個Activity
2.1個Layout
3.1個網頁
4.在Android中呼叫Javascript


SETP 1:新建專案


SETP 2:修改AndroidMainfest.xml


SETP 3:配置Layout


SETP 4:放置網頁
請將你準備要內嵌於WebViewClient的網頁放在assets資料夾,本例網頁只要提供超連結可以點擊即可,其內容如下 < html> < body> < a onClick="window.hippo.runOnAndroidJavaScript()">Click Me!< /a> < /body> < /html>
assets資料夾


SETP 5:撰寫程式碼 package com.exampl.android.homework7; import android.app.Activity; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.webkit.WebSettings; import android.webkit.WebView; public class Homework7 extends Activity { private WebView mWebView01; private Handler mHandler01 = new Handler(); /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mWebView01 = (WebView) findViewById(R.id.myWebView1); WebSettings webSettings = mWebView01.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setSaveFormData(false); webSettings.setSavePassword(false); webSettings.setSupportZoom(false); mWebView01.addJavascriptInterface(new runJavaScript(), "hippo"); mWebView01.loadUrl("file:///android_asset/test.html"); } final class runJavaScript { public void runOnAndroidJavaScript() { mHandler01.post(new Runnable() { public void run() { Intent myIntentDial = new Intent(Intent.ACTION_CALL,Uri.parse("tel:0912345678")); startActivity(myIntentDial); } }); } } }

SETP 6:執行




攔截onKeyDown使BACK按鍵運行WebViewClient之goBack,而非結束Activity

本文是Google Android應用程式範例實務課程-Day4課堂作業,說明如下。


前文透過WebViewClient瀏覽網頁,而非Android內建的瀏覽器,且載入網頁時可出現自訂的提示訊息。
本文將繼續擴大相同專案,讓Android基本按鍵BACK能予使用者「回到前一頁(網頁)」,而非結束瀏覽網頁的Activiy。


[範例情境]
1.透過Android的WebViewClient包裝網頁
2.點選BACK按鍵可以回到上一個瀏覽過的網頁

[情境分析]
1.1個Activity
2.1個Layout
3.捕捉onKeyDown以覆寫BACK按鍵原始行為


SETP 1:捕捉onKeyDown事件
Source→Override / Implement Method...→onKeyDown


SETP 2:撰寫onKeyDown程式碼
@Override public boolean onKeyDown(int keyCode, KeyEvent event) {      if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {      if (mWebView01.canGoBack())      {      mWebView01.goBack();      }      else      {      ProgressDialog d2=new ProgressDialog(Homework6.this);      d2.setTitle("ProgressDialog");         d2.setMessage("沒有上一頁");         d2.show();      }      event.startTracking();      }      return false; }
本步驟針對BACK覆寫可參考2篇文章:
1.Android官方說明
2.Android與J2ME之區別


SETP 3:執行
請實際瀏覽多個連結並測試BACK是否真的都符合history回到前一網頁。
另外,piggy還很38的模仿前文多作了個ProgressDialog,當使用者對沒有上一頁的第一個網頁按下BACK時,可以出現提示資訊讓主頁面失焦,可同時避免結束Activity。

以WebViewClient於Android開啟網頁,並以AlertDialog提示載入狀態

本文是Google Android應用程式範例實務課程-Day4課堂作業,說明如下。


[範例情境]
1.透過Android的WebViewClient包裝網頁
2.點選網頁內其他link,載入其他網頁時,必須彈出"載入中"之提示訊息
3.點選網頁內其他link,載入其他網頁時,必須直接開啟該網頁,而非另開新視窗

[情境分析]
1.1個Activity
2.1個Layout
3.要達成同一容器載入(不開新視窗)的瀏覽模式,必須思考WebViewClient的用法
4.要在載入當下,提供訊息給使用者,要會抓取onPageStarted事件
5.要在載入當下,提供訊息給使用者,要會抓取onPageFinished事件


SETP 1:新增專案


SETP 2:修改AndroidMainfest.xml


SETP 3:配置Layout


SETP 4:撰寫程式碼
依序示範如何將瀏覽網頁的預設方法改用WebViewClient來開啟,步驟將帶出不少觀念,故請務必按照順序施作。

﹡用WebViewClient開啟網頁
package com.example.android.homework6;
import android.app.Activity; import android.os.Bundle; import android.webkit.WebView; public class Homework6 extends Activity {    private WebView mWebView01;     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);                /*單純開啟網頁*/         String strURI = "http://jumpin.cc/Android/";         mWebView01 = (WebView) findViewById(R.id.myWebView1);         mWebView01.loadUrl(strURI);     } }


程式一執行即刻進入網頁
隨意點選網頁連結(如圖之"中央氣象局")
結果中央氣象局是用Android內建瀏覽器開啟,
而非我們的WebViewClient

網頁上其他超連結(中央氣象局)的開啟方式不符合本例目標,必須夠過New一個WebViewClient的方式改寫,請在onCreate內加入下面這行即可
mWebView01.setWebViewClient(new WebViewClient(){  });
成功地使用WebViewClient包裝

﹡實作前述[範例情境]之2、3點
package com.example.android.homework6; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.os.Bundle; import android.webkit.WebView; import android.webkit.WebViewClient;
public class Homework6 extends Activity { private WebView mWebView01;     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);                /*單純開啟網頁*/         String strURI = "http://jumpin.cc/Android/";         mWebView01 = (WebView) findViewById(R.id.myWebView1);         mWebView01.loadUrl(strURI);                    mWebView01.setWebViewClient(new WebViewClient(){            ProgressDialog d=new ProgressDialog(Homework6.this);                    @Override         public void onPageStarted(WebView view, String url, Bitmap favicon) {                 d.setTitle("ProgressDialog");         d.setMessage("載入中");         d.show();        }                  @Override         public void onPageFinished(WebView view, String url) {            d.dismiss();            super.onPageFinished(view, url);        }         });     } }


捕捉onPageStarted事件,叫ProgressDialog現身

捕捉onPageFinished事件,叫ProgressDialog離開
網頁就不會被擋住
重點  I:onPageStarted
重點I I:onPageFinished
重點III:AlertDialog(本例選擇ProgressDialog這種)


SETP 5:執行
執行成果如上步驟最後一張圖。
但當使用者想回到原始網頁按下BACK時,會整個跳出Activity,跑到列舉所有AP的Menu
若要修改BACK預設操作,使其符合本利期望,需要捕捉BACK之事件並且覆寫,如何實作待下回分解。

透過showModalDialog開啟新頁面,子視窗因PostBack再次開啟

嘖嘖...文章title像阿婆裹腳布一樣=..=|||
先以圖代文描述一下piggy上禮拜很開心搞定ICallBackEventHandler後遇到的小小絆腳石
用MooTool創造的側邊選單~還包含浮動效果0.<
威~~請不要責怪新開啟的定位視窗很醜T︿T
Demo階段piggy還不敢勞煩美編大人:P
前言說到的絆腳石XD

懂了吧?!雖然piggy小畫家功力爛爆了=..=|||

那要如何解決呢?差點要聽從ola兄建議,採用CallBack機制,但想想有夠抹爽~~不是很想為了這個搞大XDDDD
後來找到小撇步,透過修改子頁面(定位視窗)的< base target="_self" / >讓子頁面知道開啟時的方式,這樣就不會一直重複開新視窗嚕!那麼要安插在網頁那個位置呢,請看 <html>....略 <head runat="server">     <base target="_self"/>     <title>人孔編號</title > ....略 </head> ....略 </html>

不清楚怎麼使用JS開啟子視窗,或父子視窗如何傳值,請參考父子視窗傳值

艾隆義大利麵

本人最近又開發新強迫症,口袋瘋狂累積想吃店家後,開始以店家為中心尋找方圓百里可構成半日遊之景點,然後咧?繼續把半日遊也放進口袋,喂~~神經病(-_-;)

近日被小喬吸引後馬上38規劃小小半日遊,然小喬新疆羊肉串主打羊肉且最吸引piggy的羊肉鍋需多人分食,不知何日成行的羊肉團在好飯咖助興(?)下竟決定衝了!

我超幸運的啦!!傾盆大雨還遇到公休
小喬啊小喬~跟你還真無緣
此時好飯咖say「請端出plan B」
這這這...俺對江子翠不熟啊,只知道有分屍案...囧,恰巧隔壁是朋友曾推薦的艾隆義大利麵,plan B就是這道光啦:P
艾隆 i know pasta
來張清晰菜單scan檔瞭解下如何點餐,大抵上分為義大利麵、焗烤與燉飯,其中義大利麵品項極多元,source便有黑醬、紅醬、青醬、清炒、乾炒.....十種之多,且艾隆並非將各類source沒創意地與培根、海鮮、燻雞等常見款排列組合,假裝自己有幾十種口味,例如洋菇蝦仁便是獨屬白醬的菜色。
另外,覺得單吃義大利麵空虛者,還可搭配NTD 45-55不等的四種套餐。
看menu大圖請點我

本來被清炒 / 乾炒所吸引,但今日氣溫驟降還是想來點醬汁多多的義大利麵,看到蕃茄奶油讓piggy想起Mint風靡平價義大利麵界(?)的粉紅醬,暫且放棄最愛之青醬來點不一樣的^^

點餐結帳後服務生便火速端上套餐,but...好飯咖的套餐是奶酪耶=..=a


洋蔥濃湯不知為啥歸類為義式,因為上面淋點白色奶?!不過洋蔥有先炒過,入湯後快速釋放本身甜味,算是平價義大利麵店中有用心的了。
義式洋蔥濃湯
套餐飲料-錫蘭紅茶(熱)

蕃茄奶油海鮮帶著淡淡粉紅色,吃來有奶油白醬的香,佐以蕃茄又不會過膩,對沒吃過粉紅醬的piggy來說是個新體驗(^_^)/  海鮮份量以NTD 160來看C/P值算是夠的,不過海鮮沒有很新鮮,蛤蠣內裡偏黑狀似未吐沙,實際嚐過雖可向大家報告「沒有沙子!」,不過肉質太散、缺少海鮮緊實感卻是事實。
不過店家頗貼心,蝦子皆去殼並隨附裝蚌殼的小盤,讓你吃飽飽也吃巧巧~一點也不狼狽0.<
但好飯咖say「幫你去殼!那就表示摸過蝦子...哪知道是否_ _」  T_T
蕃茄奶油海鮮(NTD 160/小)

相較常見之紅白青醬,乾炒香蒜培根並非以醬汁打底,而是透過簡單調味佐以橄欖油乾炒,更能吃出配料香氣,若是功夫到家~這道乾炒香蒜培根肯定是吃到嘴巴臭都甘願(=^ω^=)
不過今日培根肉色偏暗,piggy就沒有主動嘗試,下次有機會再試試看艾隆百元內的乾炒系列,piggy覺得坐在乾淨舒適店內不消百元就能吃到義粉很威XDDD
乾炒香蒜培根(NTD 90/小)
自助佐料區


★艾隆義大利麵 I Know Pasta(江子翠店)
addr:台北縣板橋市仁化街32號1樓
phone:82510311 / 0953931799
website:艾隆官網
溫馨小提示:有買百送壹點的集點活動,集滿六點可任選加值套餐,或補差額換飲料

★艾隆義大利麵 I Know Pasta(新莊中港店)
addr:台北縣新莊市中港路361號
phone:89911515 / 0975519870


★吃義大利麵兒
1. NAISSANCE COFFEE
2. LA PASTA
3. 亞緹義廚 AL DENTE CUCINA

Google Android應用程式範例實務課程-Day4

課程邁入Day4,細項重點不復前三日,主要介紹更大的觀念,課後需再自行深入研習,僅記錄大重點作為study方向,心得容後補上。

﹡Android專案中的gesture.檔案是用來儲存"手勢",Google亦針對手勢提供gestureLibrary。
gesture包含三種重要屬性id、text、bitmap,id類似資料庫中自行遞增的系統流水號,text記錄該gesture名稱,bitmap記錄手勢圖形。
gesture存放於red\raw資料夾。

﹡SDcard屬於system,是可被任意存取的位置,設計AP時請考量使用場合決定儲存位置(是要歸system或user管理)。

﹡想設計出與使用者互動的AP可採用AppWidgetProviderLiveWallpaper

﹡Android與iOS(iPhone作業系統)都具備可鑲嵌網頁之UI,前者為WebView,後者為UIWebView,皆採用相同Egine運作,無須針對不同OS製作二種網頁版本,主要差別在於iOS只可GET不可POST

﹡觀察有無New一個WebClient之差異

﹡onPageFinished

﹡透過onKeyDown的捕捉能進一步處理後續各類事件。
以iPhone為例,iOS無法捕捉"BACK"返回鍵的事件,一旦誤按BACK會直接殺掉Activity生命(onPause),無法像Android抓取BACK後客製化一詢問視窗,以防止使用者在好不容易開啟AP或網頁時將其關閉。

★課堂作業
1. 以WebViewClient於Android開啟網頁,並以AlertDialog提示載入狀態
2. 攔截onKeyDown使BACK按鍵運行WebViewClient之goBack,而非結束Activity
3. 內嵌網頁JavaScript與Activity互動,以撥打電話為例@Android

CALL撥打電話 & SMS發送簡訊@Android(於不同虛擬器)

本文是Google Android應用程式範例實務課程-Day3課堂作業,說明如下。

[範例情境]
1.模擬二支電話(AVD1、AVD2)
2.AVD1要能撥打電話&發送簡訊予AVD2
3.AVD2要能儲存AVD1的IMEI資訊

[情境分析]
1.虛擬器的新增
2.2個專案
3.各1個Activity
4.各1個Layout

===============第一支電話AVD1的專案=================
SETP 1:新增專案


STEP 2:Layout配置

重點I:Input type
請將EditText01(上圖Hint為輸入電話者)之Input type屬性設為number|phone,防止使用者輸入非電話格式之字串


SETP 3:撰寫程式碼
下圖程式碼以附註詳細解說,請直接點圖放大觀看


SETP 4:AndroidManifest權限設定

重點I:uses-permission
本例包含撥打電話&發送簡訊,請在AndroidManifest.xml中添加下列2行
< uses-permission android:name="android.permission.CALL_PHONE" />
< uses-permission android:name="android.permission.SEND_SMS" />


SETP 5:執行
﹡撥打/接聽電話





﹡發送/接收簡訊




重點 I :2支手機要run在不同虛擬機器,方可呈現前述的發送/接收關係
重點 II:第2支手機(AVD2)無須寫code,接聽電話&接收簡訊為內建功能。
              只要簡單新增一乾淨專案即可



唔...後來和ola討論,發現piggy竄改課堂作業題目XDDD
範例情境第3點....待我補齊T︿T