Failed to fectch URl https://dl-ssl.google.com/android/repository/addons_list.xml, reason: Connection to https://dl-ssl.google.com refused 解決辦法來源于:code.google.com - 用notepad打開C:\WINDOWS\system32\drivers\etc中的hosts文件
- 在最后一行添加74.125.237.1 dl-ssl.google.com
- 成功解決問題。
|
做了幾個android企業應用項目后,總結了項目的基本開發步驟,希望能夠交流。 一 應用規劃: ※確定功能。 ※必須的界面及界面跳轉的流程。 ※需要的數據及數據的來源及格式。 ※是否需要服務端支持。 ※是否需要本地數據庫支持。 ※是否需要特殊權限。 ※是否需要后臺服務。 三 界面設計: ※主界面確定。 ※模塊界面、列表、查看、編輯界面。 ※菜單、按鈕、對話框、提示信息。 ※界面總體顏色。 四 數據操作和存儲: ※數據來源。 ※數據類型。 ※存儲方式。 六 頁面跳轉: ※每個頁面間的跳轉。 ※菜單、按鈕、事件等。 關鍵字: android app, android develop, android summary 從2010.04啟動該項目到現在完成主要功能模塊,分享一下開發歷程和注意事項。 開發環境: ubuntu7.10 + eclipse 3.5 + sdk 下面是開發總結: 1. 基于源碼級的SDK以及SDK升級注意事項 o 熟悉其如何做資源國際化 o 熟悉其如何支持不同屏幕大小,不同density介質 o 熟悉其主要的API以及支持的最低版本和不被再支持的API o 了解其分層架構 o 升級SDK 確保該平臺支持相關的cglib版本(否則要升級ubuntu) 簡單容行的方式是remove ~/.android下的相關東西,remove先前的相關版本,再升級 部分Resources(如strings中有%s的)可能需要修改才能適應新的版本 新的sdk里可能不包括老的如2.01版本 2. Emulator & Mobile o 用adb shell 操作emulator http://www.javaeye.com/topic/260042 o push / pull file in emulator Eclipse->window->Show View->File Explorer-> pull a file from the device(or push a file onto the device) o 用 real mobile連接usb來直接測試(mobile 必須設置為develop/debug mode) http://dimitar.me/how-to-connect-your-android-phone-to-ubuntu-to-do-developmenttestinginstallations-or-tethering/ o emulator更能用于性能測試,功能測試。而mobile更適合觸摸操作測試和一些View的真實展現測試 o 屏幕大小適應測試(枚舉大,中,小),屏幕方向(枚舉橫,豎屏),任務切換測試 o 內存適應只能在mobile上做測試 3. 系統配置項 o SharedPreferences存儲位置及如何在emulator上手動修改 找到存儲位置: \data\data\your package dir\shared_prefs\your xml files 按照上面的pull/push the file o SQLite(sqlite3) 默認存儲位置:\data\data\your package dir\databases\your database name o Other File I/O assert下文件讀取 文件權限以及讀寫 o 解讀AndroidManifest.xml application/process標識 最開始啟動的activity activity棧的形式(指定taskAffinity&launchMode="singleTask"),而且轉向一個新的activity是用intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)的形式 需要的權限部分 支持的最低版本 4. 基于View,Context,Manager的開發 o 系統View & Layout(Layout也是View) . 用View本身來做其他Layout間的一個分隔 . 常用的View&Layout: ListView,ScrollView,RelativeLayout,TableLayout . 設計常用的style/theme用到的Drawable: http://idunnolol.com/android/drawables.html . 常用的圖片操作 . 指定顏色的渲染(setColorFilter) . 剪裁 o 自定義View & Layout . Java代碼 public class TouchListView extends ListView { public TouchListView(Context context, AttributeSet attrs, int defStyle) { } } public class Toolbar extends LinearLayout { public Toolbar(final Context context) { super(context); } public Toolbar(final Context con, AttributeSet attrs) { } } activity跳轉 sendBroadcast(實時數據交換可借助Thread+ BroadcastReceiver) o WindowManager 、PackageManager 等的使用 2. 網絡IO o java.net o android.net o org.apache.http 如果沒有讓他在AsyncTask中操作,則他的TimeOut設置必須少于5秒(為ANR等待時間) java.net.UnknownHostException 如果發生在emulator,可參考: http://www.javaeye.com/topic/521023 如果發生在mobile,則一般是DNS解析問題,要么允許用戶再重試操作,要么把Host的域名改為public ip address 3. 繪圖部分 o 在View上繪圖 只在原來View上加邊框等 Java代碼 @Override protected void dispatchDraw(Canvas canvas) {} @Override protected void onDraw(Canvas canvas) { Bitmap result = Bitmap.createBitmap(48,48, Config.ARGB_8888); Canvas canvas = new Canvas(result); ... canvas.drawBitmap(result, rect, rect, paint); 2. 動畫 o 幀動畫 控制偵速率在25FPS以讓其更流暢 o 漸變動畫 平移 縮放 旋轉 透明 3. ANR o 構建消息以及消息循環處理Handler o 使用AsyncTask 4. Exception & UncaughtException o 使用UncaughtExceptionHandler 5. 引入第三方jar以及與其他app共享數據 o 通過add user library方式添加第三方jar o Content Provider的使用 6. 性能優化/調優 o 基于View的優化http://dl.javaeye.com/topics/download/774b3e9e-1c48-33bd-bc9d-5c27da998181 o 代碼級的規范 o Method級的調優 Method Profiling(如果直接usb連接mobile,需要root權限作此項) o GC分析 使用Allocation Tracker /Files/gaolei-xj/Android_app項目開發步驟總結.pdf
原理概述: 手機電池電量的獲取在應用程序的開發中也很常用,Android系統中手機電池電量發生變化的消息是通過Intent廣播來實現的,常用的Intent的Action有 Intent.ACTION_BATTERY_CHANGED(電池電量發生改變時)、Intent.ACTION_BATTERY_LOW(電池電量達到下限時)、和Intent.ACTION_BATTERY_OKAY(電池電量從低恢復到高時)。 當需要在程序中獲取電池電量的信息時,需要為應用程序注冊BroadcastReceiver組件,當特定的Action事件發生時,系統將會發出相應的廣播,應用程序就可以通過BroadcastReceiver來接受廣播,并進行相應的處理。 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="fill_parent" 4 android:layout_height="fill_parent" 5 android:orientation="vertical" > 6 7 <Button 8 android:id="@+id/button" 9 android:layout_width="fill_parent" 10 android:layout_height="wrap_content" 11 android:text="取得電池電量" /> 12 13 </LinearLayout>
1 package org.gl.demo; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.content.IntentFilter; 6 import android.os.Bundle; 7 import android.view.View; 8 import android.view.View.OnClickListener; 9 import android.widget.Button; 10 11 public class MainActivity extends Activity { 12 private Button button = null; 13 14 @Override 15 public void onCreate(Bundle savedInstanceState) { 16 super.onCreate(savedInstanceState); 17 setContentView(R.layout.main); 18 19 button = (Button) findViewById(R.id.button); 20 button.setOnClickListener(new BatteryClickListener()); 21 } 22 23 private class BatteryClickListener implements OnClickListener { 24 25 @Override 26 public void onClick(View v) { 27 BatteryBroadcastReceiver receiver = new BatteryBroadcastReceiver(); 28 IntentFilter filter = new IntentFilter( 29 Intent.ACTION_BATTERY_CHANGED); 30 MainActivity.this.registerReceiver(receiver, filter); 31 32 } 33 34 } 35 } 1 package org.gl.demo; 2 3 import android.app.AlertDialog; 4 import android.app.Dialog; 5 import android.content.BroadcastReceiver; 6 import android.content.Context; 7 import android.content.DialogInterface; 8 import android.content.Intent; 9 10 public class BatteryBroadcastReceiver extends BroadcastReceiver { 11 12 @Override 13 public void onReceive(Context context, Intent intent) { 14 if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { 15 // 獲得當前電量 16 int current = intent.getIntExtra("level", 0); 17 // 獲取總電量 18 int total = intent.getIntExtra("scale", 0); 19 Dialog dialog = new AlertDialog.Builder(context) 20 .setTitle("電池電量") 21 .setMessage( 22 "電池電量為:" + String.valueOf(current * 100 / total) 23 + "%") 24 .setNegativeButton("關閉", 25 new DialogInterface.OnClickListener() { 26 27 @Override 28 public void onClick(DialogInterface dialog, 29 int which) { 30 31 } 32 }).create(); 33 dialog.show(); 34 } 35 36 } 37 38 } 39
自己最近在找工作,一直在修改簡歷。 1、要仔細檢查已成文的個人簡歷,絕對不能出現錯別字、語法和標點符號方面的低級錯誤。最好讓文筆好的朋友幫你審查一遍,因為別人比你自己更容易檢查出錯誤 2、個人簡歷最好用A4標準復印紙打印, 字體最好采用常用的宋體或楷體,盡量不要用花里呼哨的藝術字體和彩色字, 排版要簡潔明快,切忌標新立異,排的象廣告一樣。當然,如果你應聘的是排版工作則是例外。 3、要記住你的個人簡歷必須突出重點,它不是你的個人自傳,與你申請的工作無關的事情要盡量不寫,而對你申請的工作有意義的經歷和經驗絕不能漏掉。 4、要保證你的簡歷會使招聘者在30秒之內,即可判斷出你的價值,并且決定是否聘用你。 5、你的個人簡歷越短越好,因為招聘人沒有時間或者不愿意花太多的時間閱讀一篇冗長空洞的個人簡歷。最好在一頁紙之內完成,一般不要超過兩頁。 6、要切記不要僅僅寄你的個人簡歷給你應聘的公司,附上一封簡短的應聘信,會使公司增加對你的好感。否則,你成功的幾率將大大降低。 7、要盡量提供個人簡歷中提到的業績和能力的證明資料,并作為附件附在個人簡歷的后面。一定要記住是復印件,千萬不要寄原件給招聘單位,以防丟失。 8、一定要用積極的語言,切忌用缺乏自信和消極的語言寫你的個人簡歷。 最好的方法是在你心情好的時候編寫你的個人簡歷。 9、不能憑空編造你的經歷,說謊永遠是卑鄙的,沒有哪個公司會喜歡說謊的員工,但也沒有必要寫出所有你真實的經歷。對你求職不利的經歷你可忽略不寫。 10、要組織好個人簡歷的結構,不能在一個個人簡歷中出現重復的內容。讓人感到你的個人簡歷條理清楚,結構嚴謹是很重要的。 11、最好用第三人稱寫你的個人簡歷,不要在個人簡歷中出現“我”的字樣。 12、你的個人經歷順序應該從現在開始倒過去敘訴,這樣可使招聘單位在最短的時間內了解你最近的經歷。 13、在結構嚴謹的前提下,要使你的個人簡歷富有創造性,使閱讀者能產生很強的閱讀興趣。 14、遣詞造句要精雕細磨,惜墨如金。盡量用簡練又簡練的語言。
我的觀點:其實簡歷上面是可以適當的吹下牛,尤其在你的工作經驗方面,公司主要看的就是 你的工作經驗,做的項目??茨隳懿荒芙o公司帶來利益。簡歷只是一個面試的機會,有了機會我們才能把握。此貼獻給找正在工作的童鞋?。。。?/div>
1.java.net.SocketTimeoutException這個異常比較常見,socket超時。一般有2個地方會拋出這個,一個是connect的時候,這個超時參數由connect(SocketAddress endpoint, int timeout)中的后者來決定,還有就是setSoTimeout(int timeout),這個是設定讀取的超時時間。他們設置成0均表示無限大。 ----------------------------------------------------------------------------------------------------- 2.java.net.BindException:Address already in use:JVM_Bind
該異常發生在服務器端進行new ServerSocket(port)或者socket.bind(SocketAddress bindpoint)操作時。 原因:與port一樣的一個端口已經被啟用,并進行監聽。 此時用netstat -an 命令,可以看到一個Listening狀態的端口。 只需要找到一個沒有被占用的端口就能解決這個問題。 ------------------------------------------------------------------------------------------------------ 3.java.net.ConnectException:Connection refused:connect
該異常發生在客戶端進行new Socket(ip, port)或者socket.connect(address, timeout)操作時。 原因:指定ip地址的機器不能找到(也就是說從當前機器不存在到指定ip路由), 或者是該ip存在,但找不到指定的端口進行監聽。應該首先檢查客戶端的ip和port 是否寫錯了,假如能ping通(服務器端把ping禁掉則需要另外的方法),則看在服務器端的 監聽指定端口的程序是否啟動。 -------------------------------------------------------------------------------------------------------- 4.java.net.SocketException:Socket is closed 該異常在客戶端和服務器端均可能發生。異常的原因是己方主動關閉了連接后 (調用了Socket的close方法)再對網絡連接進行讀寫操作。 ------------------------------------------------------------------------------ 5.java.net.SocketException: Connection reset或者Connect reset by peer:Socket write error 該異常在客戶端和服務器端均有可能發生,引起該異常的原因有兩個,第一個就是假如一端的Socket被關閉(或主動關閉或者因為異常退出而引起的關閉), 另一端仍發送數據,發送的第一個數據包引發該異常(Connect reset by peer)。另一個是一端退出,但退出時并未關閉該連接,另一端假如在從連接中讀數據則拋出該異常(Connection reset)。簡單的說就是在連接斷開后的讀和寫操作引起的。 對于服務器,一般的原因可以認為: a) 服務器的并發連接數超過了其承載量,服務器會將其中一些連接主動Down掉. b) 在數據傳輸的過程中,瀏覽器或者接收客戶端關閉了,而服務端還在向客戶端發送數據。 ---------------------------------------------------------------------------- 6.java.net.SocketException: Broken pipe 該異常在客戶端和服務器均有可能發生。在拋出SocketExcepton:Connect reset by peer:Socket write error后,假如再繼續寫數據則拋出該異常。前兩個異常的解決方法是首先確保程序退出前關閉所有的網絡連接,其次是要檢測對方的關閉連接操作,發現對方 關閉連接后自己也要關閉該連接。 對于4和5這兩種情況的異常,需要特別注意連接的維護。在短連接情況下還好,如果是長連接情況,對于連接狀態的維護不當,則非常容易出現異常?;旧蠈﹂L連接需要做的就是: a) 檢測對方的主動斷連(對方調用了Socket的close方法)。因為對方主動斷連,另一方如果在進行讀操作,則此時的返回值是-1。所以一旦檢測到對方斷連,則主動關閉己方的連接(調用Socket的close方法)。 b) 檢測對方的宕機、異常退出及網絡不通,一般做法都是心跳檢測。雙方周期性的發送數據給對方,同時也從對方接收“心跳數據”,如果連續幾個周期都沒有收到對 方心跳,則可以判斷對方或者宕機或者異常退出或者網絡不通,此時也需要主動關閉己方連接;如果是客戶端可在延遲一定時間后重新發起連接。雖然Socket 有一個keep alive選項來維護連接,如果用該選項,一般需要兩個小時才能發現對方的宕機、異常退出及網絡不通。 ---------------------------------------------------------------------------------------------- 7.java.net.SocketException: Too many open files 原因: 操作系統的中打開文件的最大句柄數受限所致,常常發生在很多個并發用戶訪問服務器的時候。 因為為了執行每個用戶的應用服務器都要加載很多文件(new一個socket就需要一個文件句柄),這就會導致打開文件的句柄的缺乏。 解決方式: a) 盡量把類打成jar包,因為一個jar包只消耗一個文件句柄,如果不打包,一個類就消耗一個文件句柄。 b) java的GC不能關閉網絡連接打開的文件句柄,如果沒有執行close()則文件句柄將一直存在,而不能被關閉。 也可以考慮設置socket的最大打開 數來控制這個問題。對操作系統做相關的設置,增加最大文件句柄數量。ulimit -a可以查看系統目前資源限制,ulimit -n 10240則可以修改,這個修改只對當前窗口有效。
摘要: Ctrl+1 快速修復(最經典的快捷鍵,就不用多說了)Ctrl+D: 刪除當前行 Ctrl+Alt+↓ 復制當前行到下一行(復制增加)Ctrl+Alt+↑ 復制當前行到上一行(復制增加)Alt+↓ 當前行和下面一行交互位置(特別實用,可以省去先剪切,再粘貼了)Alt+↑ 當前行和上面一行交互位置(同上)Alt+← 前一個編輯的頁... 閱讀全文
簡短說明(Quick explanation): 通過創建BroadcastReceiver來偵測系統中有關電池Intent(ACTION_BATTERY_CHANGED)的變化,一旦有接收到相關事件,將會讀取當前電量情況,并通過TextViews顯示在當前屏幕。 1 public class MyButteryDemo extends Activity { 2 private Button button = null; 3 4 @Override 5 public void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.main); 8 9 button = (Button) findViewById(R.id.btn); 10 button.setOnClickListener(new OnClickListenerImpl()); 11 } 12 13 private class OnClickListenerImpl implements OnClickListener { 14 15 @Override 16 public void onClick(View arg0) { 17 ButteryBroadcastReceiver receiver = new ButteryBroadcastReceiver(); 18 IntentFilter filter = new IntentFilter( 19 Intent.ACTION_BATTERY_CHANGED); 20 MyButteryDemo.this.registerReceiver(receiver, filter); 21 } 22 23 } 24 } 1 public class ButteryBroadcastReceiver extends BroadcastReceiver { 2 3 @Override 4 public void onReceive(Context context, Intent intent) { 5 6 if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { 7 int level = intent.getIntExtra("level", 0); 8 int scale = intent.getIntExtra("scale", 100); 9 Dialog dialog = new AlertDialog.Builder(context) 10 .setTitle("電池電量") 11 .setMessage( 12 "電池電量為:" + String.valueOf(level * 100 / scale) 13 + "%").setNegativeButton("關閉", new DialogInterface.OnClickListener() { 14 15 @Override 16 public void onClick(DialogInterface dialog, int which) { 17 // TODO Auto-generated method stub 18 19 } 20 }).create(); 21 dialog.show(); 22 } 23 } 24 25 }
開機啟動Receiver
1 public void onReceive(Context context, Intent intent) {
2 String action = intent.getAction();
3 if(Intent.ACTION_BOOT_COMPLETED.equals(action)) {
4 Intent serviceIntent = new Intent();
5 serviceIntent.setClass(context, BcsService.class);
6 context.startService(serviceIntent);
7 }
8 }
開機和網絡連接時啟動Receiver 1 @Override 2 public void onReceive(Context context, Intent intent) { 3 String action = intent.getAction(); 4 if(Intent.ACTION_BOOT_COMPLETED.equals(action) || 5 ConnectivityManager.CONNECTIVITY_ACTION.equals(action)) { 6 Intent serviceIntent = new Intent(); 7 serviceIntent.setClass(context, BcsService.class); 8 context.startService(serviceIntent); 9 } 10 }
1 if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 2 // sd card 可用 3 }else { 4 // 當前不可用 5 }
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
29 | 30 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|
常用鏈接
留言簿
隨筆分類
隨筆檔案
文章分類
搜索
最新評論

閱讀排行榜
評論排行榜
|
|