Ⅰ 如何提升android開發效率
筆者在經歷了多個Android開發項目之後,個人積累也從別處學習了很多在Android開發中非常實用的小經驗。下面從中選擇了最實用的16條,分享給大家。
1.TextView中的getTextSize返回值是以像素(px)為單位的,而setTextSize()是以sp為單位的.所以如果直接用返回的值來設置會出錯,解決辦法是用setTextSize()的另外一種形式,可以指定單位:
1
2
3
4
<span style="font-size:16px;">setTextSize(int unit, int size)
TypedValue.COMPLEX_UNIT_PX : Pixels
TypedValue.COMPLEX_UNIT_SP : Scaled Pixels
TypedValue.COMPLEX_UNIT_DIP : Device Independent Pixels</span>
2.在繼承自View時,繪制bitmap時,需要將圖片放到新建的drawable-xdpi中,否則容易出現繪制大小發生改變。
3.在文字中加下劃線: textView.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG)。
4.scrollView是繼承自frameLayout,所以在使用LayoutParams時需要用frameLayout的。
5.在Android中幾種網路編程的方式:
(1)針對TCP/IP的Socket、ServerSocket
(2)針對UDP的DatagramSocket、DatagramPackage。這里需要注意的是,考慮到Android設備通常是手持終端,IP都是隨著上網進行分配的。不是固定的。因此開發也是有 一點與普通互聯網應用有所差異的。
(3)針對直接URL的HttpURLConnection
(4)Google 集成了Apache HTTP客戶端,可使用HTTP進行網路編程。針對HTTP,Google集成了Appache Http core和httpclient 4版本,因此特別注意Android不支持 httpclient 3.x系列,而且目前並不支持Multipart(MIME),需要自行添加httpmime.jar
(5)使用Web Service。Android可以通過開源包如jackson去支持Xmlrpc和Jsonrpc,另外也可以用Ksoap2去實現Webservice
(6) 直接使用WebView視圖組件顯示網頁。基於WebView 進行開發,Google已經提供了一個基於chrome-lite的Web瀏覽器,直接就可以進行上網瀏覽網頁。
6.TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
這個是我們最常用的一個構造方法,
float fromXDelta:這個參數表示動畫開始的點離當前View X坐標上的差值;
float toXDelta, 這個參數表示動畫結束的點離當前View X坐標上的差值;
float fromYDelta, 這個參數表示動畫開始的點離當前View Y坐標上的差值;
float toYDelta)這個參數表示動畫開始的點離當前View Y坐標上的差值;
如果view在A(x,y)點 那麼動畫就是從B點(x+fromXDelta, y+fromYDelta)點移動到C 點 (x+toXDelta,y+toYDelta)點。
7.android提供了幾種在其他線程中訪問UI線程的方法
Ⅱ C# 和Android的 TCP(UDP)通信
伺服器程序
它僅僅建立ServerSocket監聽,並使用Socket獲取輸入輸出流。
import java.io.IOException;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class SimpleServer {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//創建一個ServerSocket,用於監聽客戶端socket的連接請求
ServerSocket ss=new ServerSocket(30000);
//採用循環不斷接受來自客戶端的請求,伺服器端也對應產生一個Socket
while(true){
Socket s=ss.accept();
OutputStream os=s.getOutputStream();
os.write("您好,您收到了伺服器的新年祝福!n".getBytes("utf-8"));
os.close();
s.close();
}
}}
客戶端程序
package my.learn.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
public class SimpleClient extends Activity {
private EditText show;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
show = (EditText) findViewById(R.id.show);
try {
Socket socket = new Socket("自己計算機的IP地址", 30000);
//設置10秒之後即認為是超時
socket.setSoTimeout(10000);
BufferedReader br = new BufferedReader(new InputStreamReader(
socket.getInputStream()));
String line = br.readLine();
show.setText("來自伺服器的數據:"+line);
br.close();
socket.close();
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
Log.e("UnknownHost", "來自伺服器的數據");
e.printStackTrace();
} catch (IOException e) {
Log.e("IOException", "來自伺服器的數據");
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Ⅲ android udp通信需要什麼許可權
一、有的手機不能直接接收UDP包,可能是手機廠商在定製Rom的時候把這個功能給關掉了。
1、可先在oncreate()方法裡面實例化一個WifiManager.MulticastLock 對象lock;具體如下:
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock lock= manager.createMulticastLock("test wifi");
2、在調用廣播發送、接收報文之前先調用lock.acquire()方法;
3、用完之後及時調用lock.release()釋放資源,否決多次調用lock.acquire()方法,程序可能會崩,詳情請見
Caused by: java.lang.UnsupportedOperationException: Exceeded maximum number of wifi locks
注;記得在配置文件裡面添加如下許可權:
<uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" />
經過這樣處理後,多數手機都能正常發送接收到廣播報文。
本小點轉載自Android手機接收不到UDP報文
二、在UDP通信中,android端發送UDP廣播包沒有問題。至於接收的話,有時候不能接收到包。
在UDP通信中,android端發送UDP廣播包沒有問題。至於接收的話,有時候不能接收到包。但是如果UDP包中指定了目標主機的地址的話,那麼android端就能正常接收。
下面上一段代碼,大家可用這段代碼進行測試。
1、在一個Service裡面,我們創建一個線程
public void onCreate() {//用於創建線程
WifiManager manager = (WifiManager) this
.getSystemService(Context.WIFI_SERVICE);
udphelper = new UdpHelper(manager);
//傳遞WifiManager對象,以便在UDPHelper類裡面使用MulticastLock
udphelper.addObserver(MsgReceiveService.this);
tReceived = new Thread(udphelper);
tReceived.start();
super.onCreate();
}
2、弄一個UDP幫助類,這個類主要用於發送和接收數據
package com.example.com.ihome.bang.util;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Observable;
import com.example.com.ihome.bang.tool.SendThread;
import android.net.wifi.WifiManager;
import android.util.Log;
/**
*
* UdpHelper幫助類
*
* @author 陳喆榕
*
*/
public class UdpHelper implements Runnable {
public Boolean IsThreadDisable = false;//指示監聽線程是否終止
private static WifiManager.MulticastLock lock;
InetAddress mInetAddress;
public UdpHelper(WifiManager manager) {
this.lock= manager.createMulticastLock("UDPwifi");
}
public void StartListen() {
// UDP伺服器監聽的埠
Integer port = 8903;
// 接收的位元組大小,客戶端發送的數據不能超過這個大小
byte[] message = new byte[100];
try {
// 建立Socket連接
DatagramSocket datagramSocket = new DatagramSocket(port);
datagramSocket.setBroadcast(true);
DatagramPacket datagramPacket = new DatagramPacket(message,
message.length);
try {
while (!IsThreadDisable) {
// 准備接收數據
Log.d("UDP Demo", "准備接受");
this.lock.acquire();
datagramSocket.receive(datagramPacket);
String strMsg=new String(datagramPacket.getData()).trim();
Log.d("UDP Demo", datagramPacket.getAddress()
.getHostAddress().toString()
+ ":" +strMsg );this.lock.release();
}
} catch (IOException e) {//IOException
e.printStackTrace();
}
} catch (SocketException e) {
e.printStackTrace();
}
}
public static void send(String message) {
message = (message == null ? "Hello IdeasAndroid!" : message);
int server_port = 8904;
Log.d("UDP Demo", "UDP發送數據:"+message);
DatagramSocket s = null;
try {
s = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
}
InetAddress local = null;
try {
local = InetAddress.getByName("255.255.255.255");
} catch (UnknownHostException e) {
e.printStackTrace();
}
int msg_length = message.length();
byte[] messageByte = message.getBytes();
DatagramPacket p = new DatagramPacket(messageByte, msg_length, local,
server_port);
try {
s.send(p);
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void run() {
StartListen();
}
Ⅳ Android 使用udp發送廣播
最近做項目時,遇到一個對新人我來說稍微有點麻煩的事情!
那就是使用udp協議發送廣播獲取伺服器地址!
http都好說,github開源項目不知道有多少。
可是再難的問題也要去解決!
發送廣播需要許可權!
AndroidManifest.xml 中添加:
最少這三個是必須的,多的也忘了!
原因後面會講到
使用到RxJava:
udp發送與接受都需指定埠號
廣播地址是255.255.255.255
在之前添加許可權的時候CHANGE_WIFI_MULTICAST_STATE有添加這個
往下面看
接下來我們開啟接收udp信息
發送消息?
謝謝該作者的文章讓我學會udp發送
https://blog.csdn.net/tanghongchang123/article/details/53609237
Ⅳ 如何修正安卓虛擬機收不到udp包的問題
前言
當我們做安卓開發時,大多數人還是習慣用虛擬機,畢竟真機巴拉來巴拉去的不如滑鼠方便,尤其是調試一些功能模塊時,比如socket udp , 下文說明如何用as+虛擬機調試 socket udp, 實測
如何搭建udp伺服器和客戶端不提了,簡單的搭建隨便找一個吧
首先我們的前提是 我們在pc上建立了一個UDP伺服器,目的是通過這伺服器給虛擬機發送一個udp包
但如何發送這個包呢?
如果想當然的這樣做在server上敬敬啟給"127.0.0.1:9014"發送包,然後在虛擬機的9014埠接受包,你會亮如發現無論發多少次,虛擬機什麼都收不到。 原因是,你稿坦這個包並不是發給虛擬機了,而是發給了本地埠,
也許你會說,給虛擬機發應該用虛擬機的ip地址,好的,通過嘗試我們發現給虛擬機的ip地址+9014埠,仍然無法收到。(我用工具查看的虛擬機ip地址是10.0.2.15)
正確步驟
1.把PC埠9014映射到虛擬機,意思就是當PC 9014埠收到udp包,它會轉發給虛擬機相應的埠
使用windows程序telnet即可達到映射的目的,(注意Telnet在win10需要開啟,可查找怎麼開啟這個程序)
打開cmd 輸入如下命令連接到本地虛擬機
telnet localhost 5554
連接成功後他會提示你輸入驗證,並告訴你驗證碼在哪裡
Ⅵ 《深入理解Android網路編程技術詳解與最佳實踐》epub下載在線閱讀,求百度網盤雲資源
《深入理解Android網路編程》(陳文)電子書網盤下載免費在線閱讀
鏈接:
書名:深入理解Android網路編程
作者:陳文
豆瓣評分:5.1
出版社:機械工業出版社
出版年份:2013-8-20
頁數:362
內容簡介:
這是一本Android網路編程方面的專著,旨在幫助開發者們高效地編寫出高質量的Android網路應用。不僅系統講解了Android網路編程的各項核心技術和功能模塊,通過多個案例解讀了Android網路編程的方法和技巧,而且從源碼角度深入解析了Android核心網路處理方法和關鍵應用的實現原理,包含大量最佳實踐。
全書共11章,分為三個部分:概述篇(第1章)在介紹了Android開發平台後,重點講解了Android網路程序的功能及開發環境的配置,引領讀者走進Android網路編程的大門;實戰篇(第2~8章),詳細講解了TCP、UDP、HTTP等基本網路協議在Android上的應用,展示了使用Android處理JSON、SOAP、HTML、XML等數據的方法,講解了Android中的RSS編程、Email編程、OAuth認證等,解析了Android中Locations、Maps、USB、Wi-Fi、Bluetooth、NFC等網路模塊的編程,討論了Android中線程、數據存取、消息緩存、界面更新等的處理方法,探討了SIP、XMPP等協議在Android上的應用;源碼分析篇(第9~11章)分析了Android中與HTML處理、網路處理以及部分網路應用相關的源代碼,幫助讀者從底層原理上加深對相關知識點的理解。
作者簡介:
陳文資深Android開發工程師,深入分析過Android系統的源代碼,對Android系統的底層原理有非常深入的認識,尤其是與網路編程相關的功能模塊。精通XMPP協議和企業級雲端系統的構建,現從事移動互聯網系統的框架設計和研發工作。此外,他對Java、HMTL 5、Web數據挖掘、個性化搜索引擎等技術也有一定的研究。
Ⅶ android socket udp 怎麼封裝ip+報頭+協議
CP包
每個tcp都包含源埠號和目標埠號,加上ip頭中的源ip和目的ip,唯一確定一個tcp連接。序號用來標識從tcp發端向tcp收端發送的數據位元組流,它表示在這個報文段中的第一個數據位元組。序號欄位包含由這個主機選擇的該連接的初始序號isn(Initial Sequence Number)。該主機要發送數據的第一個位元組,序號為isn+1,因為syn佔用了一個序號。
IP包
IPV4報頭有12個必需的欄位和可選IP選項欄位,位於要發送的數據之前。如果使用IP層已有的庫或其他組件,一般不必考慮報頭中的大多數欄位,但程序代碼需要提供源端和目的端地址。
1、版本(4比特)
IP協議版本已經經過多次修訂,1981年的RFC0791描述了IPV4,RCF2460中介紹了IPV6。
2、報頭長度(4比特)
報頭長度是報頭數據的長度,以4位元組表示,也就是以32位元組為單位。報頭長度是可變的。必需的欄位使用20位元組(報頭長度為5,IP選項欄位最多有40個附加位元組(報頭長度為15)。
3、服務類型(8比特)
該欄位給出發送進程建議路由器如何處理報片的方法。可選擇最大可靠性、最小延遲、最大吞吐量和最小開銷。路由器可以忽略這部分。
4、數據報長度(16比特)
該欄位是報頭長度和數據位元組的總和,以位元組為單位。最大長度為65535位元組。
5、標識符(16比特)
原是數據的主機為數據報分配一個唯一的數據報標識符。在數據報傳向目的地址時,如果路由器將數據報分為報片,那麼每個報片都有相同的數據標識符。
6、標志(3比特)
標志欄位中有2為與報片有關。
位0:未用。
位1:不是報片。如果這位是1,則路由器就不會把數據報分片。路由器會盡可能把數據報傳給可一次接收整個數據報的網路;否則,路由器會放棄數據報,並返回 差錯報文,表示目的地址不可達。IP標准要求主機可以接收576位元組以內的數據報,因此,如果想把數據報傳給未知的主機,並想確認數據報沒有因為大小的原 因而被放棄,那麼就使用少於或等於576位元組的數據。
位2:更多的報片。如果該位為1,則數據報是一個報片,但不是該分片數據報的最後一個報片;如果該位為0,則數據報沒有分片,或者是最後一個報片。
7、報片偏移(13比特)
該欄位標識報片在分片數據報中的位置。其值以8位元組為單位,最大為8191位元組,對應65528位元組的偏移。
例如,將要發送的1024位元組分為576和424位元組兩個報片。首片的偏移是0,第二片的偏移是72(因為72×8=576)。
8、生存時間(8比特)
如果數據報在合理時間內沒有到達目的地,則網路就會放棄它。生存時間欄位確定放棄數據報的時間。
生存時間表示數據報剩餘的時間,每個路由器都會將其值減一,或遞減需要數理和傳遞數據報的時間。實際上,路由器處理和傳遞數據報的時間一般都小於1S,因此該值沒有測量時間,而是測量路由器之間跳躍次數或網段的個數。發送數據報的計算機設置初始生存時間。
9、協議(8比特)
該欄位指定數據報的數據部分所使用的協議,因此IP層知道將接收到的數據報傳向何處。TCP協議為6,UDP協議為17。
10、報頭檢驗和(16比特)
該字端使數據報的接收方只需要檢驗IP報頭中的