Ref : http://www.unood.me/2013/07/android-app.html
[Android app開發基本概念] 偵測網路是否連線狀態
在Android手機中判斷是否連網可以通過 ConnectivityManager 類別的getActiveNetworkInfo()方法判斷,首先獲取網路通訊類的實例 :
再來可以使用cm.getActiveNetworkInfo().isAvailable(); 來返回是否有效,如果為True則表示當前Android手機已經連網,可能是WiFi或GPRS、HSDPA等等,具體的可以通過ConnectivityManager 類別的getActiveNetworkInfo()方法判斷詳細的接入方式需要注意的是有關調用需要加入以下許可權,同時在一些網路超時的時候也可以檢查下網路連接是否存在,以免浪費手機上的電力資源。
Https與Http類似,只不過Https一般是通過post請求服務器,但是Https與http不同的是Https與服務器會話是處於連接狀態。http則發送請求後連接就會斷開。
另外使用HttpsURLConnection時需要實現HostnameVerifier 和 X509TrustManager,這兩個實現是必須的,要不會報安全驗證異常。然後初始化X509TrustManager中的SSLContext, 為javax.net.ssl.HttpsURLConnection設置默認的SocketFactory和HostnameVerifier。
之後最好要用UrlEncodedFormEntity()方法告訴伺服器 ,你傳進的那些參數值字串的編碼為何。預設的編碼是 ISO-8859-1,不傳的話會把你的傳入的UTF-8中文搞亂了。
其實很簡單,只需要在res目錄下創建不同的layout文件夾,比如layout-640x360,layout-800x480,所有的layout文件在編譯之後都會寫入R.java裡,而系統會根據螢幕的大小自己選擇合適的layout進行使用。
在開發程序時為了兼容不同平台不同螢幕,建議各自文件夾根據需求均存放不同版本圖片。
要讓程序界面保持一個方向,不隨手機方向轉動而變化的處理辦法:
在AndroidManifest.xml裡面配置一下就可以了。加入這一行
1
| ConnectivityManager cm =(ConnectivityManager) activity.getSystemService(Context.CONNECTIVITY_SERVICE); |
再來可以使用cm.getActiveNetworkInfo().isAvailable(); 來返回是否有效,如果為True則表示當前Android手機已經連網,可能是WiFi或GPRS、HSDPA等等,具體的可以通過ConnectivityManager 類別的getActiveNetworkInfo()方法判斷詳細的接入方式需要注意的是有關調用需要加入以下許可權,同時在一些網路超時的時候也可以檢查下網路連接是否存在,以免浪費手機上的電力資源。
[Android app開發基本概念] https post連線請求建立方法教學
Https與Http類似,只不過Https一般是通過post請求服務器,但是Https與http不同的是Https與服務器會話是處於連接狀態。http則發送請求後連接就會斷開。
另外使用HttpsURLConnection時需要實現HostnameVerifier 和 X509TrustManager,這兩個實現是必須的,要不會報安全驗證異常。然後初始化X509TrustManager中的SSLContext, 為javax.net.ssl.HttpsURLConnection設置默認的SocketFactory和HostnameVerifier。
之後最好要用UrlEncodedFormEntity()方法告訴伺服器 ,你傳進的那些參數值字串的編碼為何。預設的編碼是 ISO-8859-1,不傳的話會把你的傳入的UTF-8中文搞亂了。
package
com.unood.eaccounts.base;
import
java.io.IOException;
import
java.net.Socket;
import
java.net.UnknownHostException;
import
java.security.KeyManagementException;
import
java.security.KeyStore;
import
java.security.KeyStoreException;
import
java.security.NoSuchAlgorithmException;
import
java.security.UnrecoverableKeyException;
import
java.security.cert.CertificateException;
import
java.security.cert.X509Certificate;
import
javax.net.ssl.SSLContext;
import
javax.net.ssl.TrustManager;
import
javax.net.ssl.X509TrustManager;
import
org.apache.http.HttpVersion;
import
org.apache.http.client.HttpClient;
import
org.apache.http.conn.ClientConnectionManager;
import
org.apache.http.conn.scheme.PlainSocketFactory;
import
org.apache.http.conn.scheme.Scheme;
import
org.apache.http.conn.scheme.SchemeRegistry;
import
org.apache.http.conn.ssl.SSLSocketFactory;
import
org.apache.http.impl.client.DefaultHttpClient;
import
org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import
org.apache.http.params.BasicHttpParams;
import
org.apache.http.params.HttpParams;
import
org.apache.http.params.HttpProtocolParams;
import
org.apache.http.protocol.HTTP;
public
class
SSL
extends
SSLSocketFactory
{
SSLContext mSSLContext = SSLContext.getInstance(
"TLS"
);
@Override
public
Socket createSocket()
throws
IOException
{
return
mSSLContext.getSocketFactory().createSocket();
}
@Override
public
Socket createSocket(Socket socket, String host,
int
port,
boolean
autoClose)
throws
IOException, UnknownHostException
{
return
mSSLContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
public
SSL(KeyStore truststore)
throws
NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException
{
super
(truststore);
TrustManager mTrustManager =
new
X509TrustManager()
{
@Override
public
void
checkClientTrusted(X509Certificate[] chain, String authType)
throws
CertificateException
{}
@Override
public
void
checkServerTrusted(X509Certificate[] chain, String authType)
throws
CertificateException
{}
@Override
public
X509Certificate[] getAcceptedIssuers()
{
return
null
;
}
};
mSSLContext.init(
null
,
new
TrustManager[]
{ mTrustManager },
null
);
}
public
static
HttpClient createMyHttpClient()
{
try
{
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(
null
,
null
);
SSLSocketFactory mSSLSocketFactory =
new
SSL(trustStore);
mSSLSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
HttpParams params =
new
BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
SchemeRegistry registry =
new
SchemeRegistry();
registry.register(
new
Scheme(
"http"
, PlainSocketFactory.getSocketFactory(),
80
));
registry.register(
new
Scheme(
"https"
, mSSLSocketFactory,
443
));
ClientConnectionManager ccm =
new
ThreadSafeClientConnManager(params, registry);
return
new
DefaultHttpClient(ccm, params);
}
catch
(KeyStoreException e)
{
e.printStackTrace();
}
catch
(NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch
(CertificateException e)
{
e.printStackTrace();
}
catch
(IOException e)
{
e.printStackTrace();
}
catch
(KeyManagementException e)
{
e.printStackTrace();
}
catch
(UnrecoverableKeyException e)
{
e.printStackTrace();
}
return
new
DefaultHttpClient();
}
}
然後再你想要做https連線請求post的地方做以下操作;
HttpClient client =
new
DefaultHttpClient();
client = SSL.createMyHttpClient();
List<NameValuePair> nvps =
new
ArrayList<NameValuePair>();
nvps.add(
new
BasicNameValuePair(
"參數名稱"
,
"參數值"
));
post.setEntity(
new
UrlEncodedFormEntity(nvps, HTTP.UTF_8));
HttpResponse response = client.execute(post);
不同的LAYOUT
Android手機螢幕大小不一,有480x320, 640x360, 800x480.怎樣才能讓App自動適應不同的螢幕呢?其實很簡單,只需要在res目錄下創建不同的layout文件夾,比如layout-640x360,layout-800x480,所有的layout文件在編譯之後都會寫入R.java裡,而系統會根據螢幕的大小自己選擇合適的layout進行使用。
HDPI、MDPI、LDPI
在之前的版本中,只有一個drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三個,這三個主要是為了支持多解析度。drawable- hdpi、drawable- mdpi、drawable-ldpi的區別:
- drawable-hdpi裡面存放高分辨率的圖片,如WVGA (480x800),FWVGA (480x854)
- drawable-mdpi裡面存放中等分辨率的圖片,如HVGA (320x480)
- drawable-ldpi裡面存放低分辨率的圖片,如QVGA (240x320)
在開發程序時為了兼容不同平台不同螢幕,建議各自文件夾根據需求均存放不同版本圖片。
屏幕方向
橫屏豎屏自動切換
可以在res目錄下建立layout-port和layout-land兩個目錄,裡面分別放置豎屏和橫屏兩種佈局文件,這樣在手機屏幕方向變化的時候系統會自動調用相應的佈局文件,避免一種佈局文件無法滿足兩種屏幕顯示的問題。不切換
還要說明一點:每個activity都有這個屬性screenOrientation,每個activity都需要設置,可以設置為豎屏(portrait)或橫屏(landscape),也可以設置為無重力感應(nosensor)。要讓程序界面保持一個方向,不隨手機方向轉動而變化的處理辦法:
在AndroidManifest.xml裡面配置一下就可以了。加入這一行
1
| android:screenOrientation="landscape" |
<
manifest
android:versioncode
=
"1"
android:versionname
=
"1.0"
package
=
"com.ray.linkit"
xmlns:android
=
"http://schemas.android.com/apk/res/android"
>
<
application
android:icon
=
"@drawable/icon"
android:label
=
"@string/app_name"
>
<
activity
android:label
=
"@string/app_name"
android:name
=
".Main"
android:screenorientation
=
"portrait"
>
<
intent-filter
>
<
action
android:name
=
"android.intent.action.MAIN"
>
<
category
android:name
=
"android.intent.category.LAUNCHER"
>
</
category
></
action
></
intent-filter
>
</
activity
>
<
activity
android:name
=
"
.GamePlay
"
android:screenorientation
=
"portrait"
>
</
activity
>
<
activity
android:name
=
"
.OptionView
"
android:screenorientation
=
"portrait"
>
</
activity
>
</
application
>
<
uses-sdk
android:minsdkversion
=
"3"
>
</
uses-sdk
></
manifest
>
另外,android中每次螢幕的切換動會重啟Activity,所以應該在Activity銷毀前保存當前活動的狀態,在Activity再次Create的時候載入配置,那樣,進行中的遊戲就不會自動重啟了!
有的程序適合從豎屏切換到橫屏,或者反過來,這個時候怎麼辦呢?可以在配置Activity的地方進行如下的配置android:screenOrientation="portrait"。這樣就可以保證是豎屏總是豎屏了,或者landscape橫向。
而有的程序是適合橫豎屏切換的。如何處理呢?首先要在配置Activity的時候進行如下的配置:android:configChanges="keyboardHidden|orientation",另外需要重寫Activity的onConfigurationChanged方法。實現方式如下,不需要做太多的內容:
@Override
public
void
onConfigurationChanged(Configuration newConfig) {
super
.onConfigurationChanged(newConfig);
if
(
this
.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// land do nothing is ok
}
else
if
(
this
.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
// port do nothing is ok
}
}
沒有留言:
張貼留言