① android網路操作的幾種方法
第一種方式:使用HttpURLConnection進行聯網操作
這個方法需要我們手動構建一個http請求包,發送到指定的伺服器
get方式
設置URL
打開連接
設置請求方法為get
設置連接超時時間
設置讀取超時時間
把當前的request發送到伺服器端
等待伺服器的響應(此處會阻塞)
獲得響應碼(並在響應碼中做相應的操作),因為安卓子線程內不允許做UI更新的操作,所以需要轉到主線程來做(通過安卓中的handler來將信息傳遞到主線程)
java">publicvoidgetPic(Viewv){
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
//首先要支出伺服器的地址
URLurl=newURL("http://192.168.2.1/day10_NetworkServer/brushli.jpg");
//通過http連接
=(HttpURLConnection)url.openConnection();
//設置請求方式,並設置等待響應時間
httpurlConnection.setRequestMethod("GET");
httpurlConnection.setConnectTimeout(5000);
//把當前的request發送到伺服器(安卓不允許在主線程內做耗時操作,如連接伺服器)
httpurlConnection.connect();
//發送完連接後等待操作,這個是阻塞式方法,
intresponseCode=httpurlConnection.getResponseCode();
//根據得到的響應代碼和response的信息作出相應的操作
if(responseCode==200){
//從伺服器讀取正確與否的信息
InputStreamis=httpurlConnection.getInputStream();
Filefile=newFile("/data/data/com.rgd.day10_network_3/files");
file.mkdir();
FileOutputStreamfos=newFileOutputStream(newFile("/data/data/com.rgd.day10_network_3/files/brushli.jpg"));
byte[]buffer=newbyte[1024];
intread;
while((read=is.read(buffer))!=-1){
fos.write(buffer,0,read);
}
//由於子線程不允許做UI更新操作,與要通過Handler進行和主線程的通信操作
Messagemsg=newMessage();
msg.what=1;
handler.sendMessage(msg);
fos.close();
is.close();
}
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
}
Handlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
switch(msg.what){
case1:
Toast.makeText(MainActivity.this,"保存圖片成功",Toast.LENGTH_LONG).show();
break;
case2:
Toast.makeText(MainActivity.this,"保存MP3成功",Toast.LENGTH_LONG).show();
break;
case3:
Toast.makeText(MainActivity.this,"保存視頻成功",Toast.LENGTH_SHORT).show();
default:
break;
}
}
};
2.post方式
操作跟get差不多,除了post傳遞信息是通過正文傳遞的,而get是放在連接中的
newThread(newRunnable(){
@Override
publicvoidrun(){
try{
//首先要支出伺服器的地址
URLurl=newURL("http://192.168.106.1/day10_NetworkServer/servlet/loginInfo");
//通過http連接
=(HttpURLConnection)url.openConnection();
//設置請求方式,並設置等待響應時間
httpurlConnection.setRequestMethod("POST");
httpurlConnection.setConnectTimeout(5000);
Stringdata="username="+username+"&password="+password+"&email="+email+"&phonenumber="+phonenumber;
OutputStreamoutputStream=httpurlConnection.getOutputStream();
outputStream.write(data.getBytes());
//把當前的request發送到伺服器(安卓不允許在主線程內做耗時操作,如連接伺服器)
httpurlConnection.connect();
//發送完連接後等待操作,這個是阻塞式方法,
intresponseCode=httpurlConnection.getResponseCode();
//根據得到的響應代碼和response的信息作出相應的操作
if(responseCode==200){
//從伺服器讀取正確與否的信息
InputStreamis=httpurlConnection.getInputStream();
byte[]buffer=newbyte[1024];
intread=is.read(buffer);
Stringresult=newString(buffer,0,read);
//由於子線程不允許做UI更新操作,與要通過Handler進行和主線程的通信操作
Messagemsg=newMessage();
msg.what=1;
handler.sendMessage(msg);
}else{
Messagemsg=newMessage();
msg.what=-1;
handler.sendMessage(msg);
}
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
}).start();
② 獲取android手機的自帶存儲路徑和sdcard存儲路徑
android手機獲取自帶存儲路徑和sd卡存儲路徑的方式是:
調用Environment.getExternalStorageDirectory,返回的存儲目錄並不是系統內置的SD卡目錄。
1、手機將eMC存儲掛載到 /mnt/external_sd 、/mnt/sdcard2 等節點,而將外置的SD卡掛載到 Environment.getExternalStorgeDirectory這個結點。
Android在正式發行之前,最開始擁有兩個內部測試版本,並且以著名的機器人名稱來對其進行命名,它們分別是:阿童木(AndroidBeta),發條機器人(Android 1.0)。後來由於涉及到版權問題,谷歌將其命名規則變更為用甜點作為它們系統版本的代號的命名方法。
Android的系統架構和其操作系統一樣,採用了分層的架構。從架構圖看,Android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和Linux內核層。
③ android實現介面時有幾個原則
1、Throwable介面中的getStackTrace()方法(或者Thread類的getStackTrace()方法),根據這個方法可以得到函數的逐層調用地址,其返回值為StackTraceElement[];
2、StackTraceElement類,其中四個方法getClassName(),getFileName(),getLineNumber(),getMethodName()在調試程序列印Log時非常有用;
3、UncaughtExceptionHandler介面,再好的代碼異常難免,利用此介面可以對未捕獲的異常善後;
使用參見:Android使用UncaughtExceptionHandler捕獲全局異常
4、Resources類中的getIdentifier(name, defType, defPackage)方法,根據資源名稱獲取其ID,做UI時經常用到;
5、View中的isShown()方法,以前都是用view.getVisibility() == View.VISIBLE來判斷的(╯□╰);(謝評論提醒,這裡面其實有一個坑:【android】view.isShown ()的用法)
6、Arrays類中的一系列關於數組操作的工具方法:binarySearch(),asList(),equals(),sort(),toString(),OfRange()等;
Collections類中的一系列關於集合操作的工具方法:sort(),reverse()等;
7、android.text.format.Formatter類中formatFileSize(Context, long)方法,用來格式化文件Size(B → KB → MB → GB);
8、android.media.ThumbnailUtils類,用來獲取判棚帶媒體(圖片、視頻)縮略圖;
9、String類中的format(String, Object...)方法,用來格式化strings.xml中的字元串(多謝 @droider An 提示:Context類中getString(int, Object... )方法用起來更加方便);
10、View類中的三個方法:callOnClick(),performClick(),performLongClick(),用於觸發View的點擊事件;
11、TextUtils類中的isEmpty(CharSequence)方法,判斷字元串是否為null或"";
12、TextView類中的append(CharSequence)方法,添加文本。一些特殊文本直接用+連接會變掘蘆成String;
13、View類中的getDrawingCache()等一系列方法,目前只知道可以用來截圖;
14、DecimalFormat類,用於字串格式化包括指定位數、百分數、科學計數法等;
15、System類中的array(src, srcPos, dest, destPos, length)方法,用來數組;
16、Fragment類中的onHiddenChanged(boolean)方法,使用FragmentTransaction中的hide(),show()時貌似Fragment的其它生命周期方法都不和慎會被調用,太坑爹!
17、Activity類中的onWindowFocusChanged(boolean),onNewIntent(intent)等回調方法;
18、View類中的getLocationInWindow(int[])方法和getLocationOnScreen(int[])方法,獲取View在窗口/屏幕中的位置;
19、TextView類中的setTransformationMethod(TransformationMethod)方法,可用來實現「顯示密碼」功能;
20、TextWatcher介面,用來監聽文本輸入框內容的改變,可用來實現一系列具有特殊功能的文本輸入框;
21、View類中的setSelected(boolean)方法結合android:state_selected=""用來實現圖片選中效果;
22、Surface設置透明:SurfaceView.setZOrderOnTop(true);
SurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);但是會擋住其它控制項;
23、ListView或GridView類中的setFastScrollEnabled(boolean)方法,用來設置快速滾動滑塊是否可見,當然前提是item夠多;
24、PageTransformer介面,用來自定義ViewPager頁面切換動畫,用setPageTransformer(boolean, PageTransformer)方法來進行設置;
25、apache提供的一系列jar包:commons-lang.jar,commons-collections.jar,commons-beanutils.jar等,裡面很多方法可能是你曾經用幾十幾百行代碼實現過的,但是執行效率或許要差很多,比如:ArrayUtils,StringUtils……;
26、AndroidTestCase類,Android單元測試,在AndroidStudio中使用非常方便;
27、TextView類的setKeyListener(KeyListener)方法;
其中DigitsKeyListener類,使用getInstance(String accepted)方法即可指定EditText可輸入字元集;
28、ActivityLifecycleCallbacks介面,用於在Application類中監聽各Activity的狀態變化;
29、Context類中的createPackageContext(packageName, flags)方法,可用來獲取指定包名應用程序的Context對象。
④ Android APK 如何通過代碼清除藍牙已配對設備列表
貌似Android沒有公開清除藍牙配對的方法,一般提到的方法是使用反射來調用BluetoothDevice.removeBond,比如下面的例子:
private void unpairDevice(BluetoothDevice device) {
try {
Method m = device.getClass()
.getMethod("removeBond", (Class[]) null);
m.invoke(device, (Object[]) null);
} catch (Exception e) {
Log.e(TAG, e.getMessage());
}
}
⑤ android 怎麼動態的載入類
android 如何動態的載入類----app插件技術
轉自:http://blog.csdn.net/mingli198611/article/details/8858076
?
前言:
?
? ? ? 在目前的軟硬體環境下,Native App與Web App在用戶體驗上有著明顯的優勢,但在實際項目中有些會因為業務的頻繁變更而頻繁的升級客戶端,造成較差的用戶體驗,而這也恰恰是Web App的優勢。現如今很多項目要求需要採用類似於微信或Q游這樣的插件化開發模式越來越多,本文就是闡述android的動態載入技術來滿足插件化開發模式的文章。
?
1.基本概念
1.1??在Android中可以動態載入,但無法像Java中那樣方便動態載入jar。
Android的虛擬機(DalvikVM)是不認識Java打出jar的byte code,需要通過dx工具來優化轉換成Dalvikbyte code才行。這一點在咱們Android項目打包的apk中可以看出:引入其他Jar的內容都被打包進了classes.dex。即android要載入的java類必須dex格式的代碼文件.
1.2??在Android中可以載入基於NDK的so庫。
NDK的執行效率很高,加密性很好,但同時開發入門難度大,一般用於加解密、數學運算等場合。so的載入很簡單,如果APK發布時已經攜帶了so文件,只需要在載入時調用System.loadLibrary(libName)方法即可。由於軟體的安裝目錄中存放so的目錄是沒有寫許可權的,開發者不能更改該目錄的內容,所以如果要動態載入存放在其他地方的so文件,用System.load(pathName)方法即可。
1.3??在Android中支持動態載入dex文件的兩種方式:
DexClassLoader:這個可以載入jar/apk/dex,也可以從SD卡中載入,也是本文的重點
PathClassLoader:只能載入已經安裝到Android系統中的apk文件。也就是 /data/app 目錄下的 apk 文件。其它位置的文件載入的時候都會出現 ClassNotFoundException.因為 PathClassLoader 會去讀取 /data/dalvik-cache 目錄下的經過 Dalvik 優化過的 dex 文件,這個目錄的 dex 文件是在安裝 apk 包的時候由 Dalvik 生成的。
?
2.注意
2.1 採用不用安裝的插件開發模式,只能夠使用?DexClassLoader進行載入.不過動態載入是有一些限制的,比如插件(子apk)包中的Activity、Service類是不能動態載入的,因為缺少聲明;即使你在Manifest文件中進行了聲明,系統默認也是到安裝apk所在的路徑中去尋找類,所以你會遇到一個ClassNotFound的異常。插件里你可以用主apk中先前放入的layout、strings等資源。但是插件中自帶的界面只能用純代碼進行編寫,插件中是不能載入插件(子apk)中的xml作為layout等資源使用的。所以在開發上一些特效會比較困難些,建議預先植入主apk中。
2.2?大家可以看看DexClassLoader的API文檔,裡面不提倡從SD卡載入,不安全
3.如何製作插件
3.1 把工程導出為jar包
3.2 執行SDK安裝目錄android-sdk-windows\platform-tools下的dx命令,把jar包轉換為dex格式
dx?--dex?--output=dex名 jar包名
4.如何做到啟動未安裝的apk中的activity?
採用反射機制,把主apk中的activity的context傳遞到插件的activity中,然後採用反射進行回調插件activity的方法。不足之出就是,插件中的activity並不是真正的activity,它只是運行在主activity中。比如:點擊返回直接退出當前activity而不是回到主activity。實例如下:
?
這是調用的Activity:
?
[java]?view plain ? ?
package?com.beyondsoft.activity;??
??
import?java.lang.reflect.Constructor;??
import?java.lang.reflect.InvocationTargetException;??
import?java.lang.reflect.Method;??
??
import?dalvik.system.DexClassLoader;??
import?android.app.Activity;??
import?android.content.pm.PackageInfo;??
import?android.os.Bundle;??
import?android.util.Log;??
??
public?class?PlugActivity?extends?Activity?{??
??
????private?Class?mActivityClass;??
????private?Object?mActivityInstance;??
????Class?localClass;??
????private?Object?instance;??
??
????@Override??
????protected?void?onCreate(Bundle?savedInstanceState)?{??
????????super.onCreate(savedInstanceState);??
??
????????Bundle?paramBundle?=?new?Bundle();??
????????paramBundle.putBoolean("KEY_START_FROM_OTHER_ACTIVITY",?true);??
????????paramBundle.putString("str",?"PlugActivity");??
????????String?dexpath?=?"/sdcard/FragmentProject.apk";??
????????String?dexoutputpath?=?"/mnt/sdcard/";??
????????LoadAPK(paramBundle,?dexpath,?dexoutputpath);??
????}??
??
????@Override??
????protected?void?onStart()?{??
????????super.onStart();??
????????Method?start;??
????????try?{??
????????????start?=?localClass.getMethod("onStart");??
????????????????start.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????//?TODO?Auto-generated?catch?block??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onResume()?{??
????????//?TODO?Auto-generated?method?stub??
????????super.onResume();??
????????Method?resume;??
????????try?{??
????????????resume?=?localClass.getMethod("onResume");??
????????????resume.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????//?TODO?Auto-generated?catch?block??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onPause()?{??
????????super.onPause();??
????????Method?pause;??
????????try?{??
????????????pause?=?localClass.getMethod("onPause");??
????????????pause.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onStop()?{??
????????super.onStop();??
????????try?{??
????????????Method?stop?=?localClass.getMethod("onStop");??
????????????stop.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????e.printStackTrace();??
????????}??
????}??
??
????@Override??
????protected?void?onDestroy()?{??
????????//?TODO?Auto-generated?method?stub??
????????super.onDestroy();??
????????try?{??
????????????Method?des?=?localClass.getMethod("onDestroy");??
????????????des.invoke(instance);??
????????}?catch?(Exception?e)?{??
????????????//?TODO?Auto-generated?catch?block??
????????????e.printStackTrace();??
????????}??
????}??