『壹』 如何簡單使用代理伺服器上網
方法/步驟 如何獲取免費代理IP
1
網路「有代理」,打開網站。單擊選擇下面「最新代理」中的第一行 「05月07日 最新代理ip地址大全」。
2
打開後會看到網頁上有很多代理IP地址。
3
選擇國內的一個代理伺服器作為演示,如圖,注釋的是廣東電信。
END
方法/步驟2 設置代理伺服器並訪問
1
打開傲遊雲瀏覽器,單擊左上角的用戶圖標,在彈出菜單中點擊「設置」。
2
跳出設置窗口,選擇左側菜單項中的「代理伺服器」
3
在 「代理伺服器設置」 中選擇 「使用自定義代理」,點擊添加。
4
在跳出窗口填寫代理伺服器信息,如圖所示,填完然後單擊確定。注意:14.29.117.37:80@HTTP 這是演示用的代理IP,其中14.29.117.37即為地址,80為埠,HTTP為類型,其中用戶名和密碼不用填。
5
添加成功,由於代理伺服器裡面只有這一個,所以被默認使用。如果含有多個代理伺服器,則需要先選中要使用的伺服器,再單擊默認。
6
接下來就是測試是否成功啦。網路「ip」,在搜索結果中可以看到,本地ip已經變成了代理伺服器ip。
7
設置代理成功。
『貳』 android開發中跨進程通信有幾種方式
Android進程間通信的幾種方式 定義多進程
第一:Android應用中使用多進程只有一個辦法(用NDK的fork來做除外),就是在AndroidManifest.xml中聲明組件時,用android:process屬性來指定。
不知定process屬性,則默認運行在主進程中,主進程名字為包名。
android:process = package:remote,將運行在package:remote進程中,屬於全局進程,其他具有相同shareUID與簽名的APP可以跑在這個進程中。
android:process = :remote ,將運行在默認包名:remote進程中,而且是APP的私有進程,不允許其他APP的組件來訪問。
第二:多進程引發的問題
靜態成員和單例失效:每個進程保持各自的靜態成員和單例,相互獨立。
線程同步機制失效:每個進程有自己的線程鎖。
SharedPreferences可靠性下降:不支持並發寫,會出現臟數據。
Application多次創建:不同進程跑在不同虛擬機,每個虛擬機啟動會創建自己的Application,自定義Application時生命周期會混亂。
綜上,不同進程擁有各自獨立的虛擬機,Application,內存空間,由此引發一系列問題。
第三: 進程間通信
Bundle/Intent傳遞數據:
可傳遞基本類型,String,實現了Serializable或Parcellable介面的數據結構。Serializable是java的序列化方法,Parcellable是Android的序列化方法,前者代碼量少(僅一句),但I/O開銷較大,一般用於輸出到磁碟或網卡;後者實現代碼多,效率高,一般用戶內存間序列化和反序列化傳輸。
文件共享:
對同一個文件先後寫讀,從而實現傳輸,linux機制下,可以對文件並發寫,所以要注意同步。順便一提,Windows下不支持並發讀或寫。
Messenger:
Messenger是基於AIDL實現的,服務端(被動方)提供一個Service來處理客戶端(主動方)連接,維護一個Handler來創建Messenger,在onBind時返回Messenger的binder。
雙方用Messenger來發送數據,用Handler來處理數據。Messenger處理數據依靠Handler,所以是串列的,也就是說,Handler接到多個message時,就要排隊依次處理。
AIDL:
AIDL通過定義服務端暴露的介面,以提供給客戶端來調用,AIDL使伺服器可以並行處理,而Messenger封裝了AIDL之後只能串列運行,所以Messenger一般用作消息傳遞。
通過編寫aidl文件來設計想要暴露的介面,編譯後會自動生成響應的java文件,伺服器將介面的具體實現寫在Stub中,用iBinder對象傳遞給客戶端,客戶端bindService的時候,用asInterface的形式將iBinder還原成介面,再調用其中的方法。
ContentProvider:
系統四大組件之一,底層也是Binder實現,主要用來為其他APP提供數據,可以說天生就是為進程通信而生的。自己實現一個ContentProvider需要實現6個方法,其中onCreate是主線程中回調的,其他方法是運行在Binder之中的。自定義的ContentProvider注冊時要提供authorities屬性,應用需要訪問的時候將屬性包裝成Uri.parse("content://authorities")。還可以設置permission,readPermission,writePermission來設置許可權。 ContentProvider有query,delete,insert等方法,看起來貌似是一個資料庫管理類,但其實可以用文件,內存數據等等一切來充當數據源,query返回的是一個Cursor,可以自定義繼承AbstractCursor的類來實現。
Socket:
學過計算機網路的對Socket不陌生,所以不需要詳細講述。只需要注意,Android不允許在主線程中請求網路,而且請求網路必須要注意聲明相應的permission。然後,在伺服器中定義ServerSocket來監聽埠,客戶端使用Socket來請求埠,連通後就可以進行通信。
『叄』 基於aidl跨進程通信的實現原理是怎樣的
一、概述:跨進程通信(AIDL),主要實現進程(應用)間數據共享功能。
二、實現原理:
1、伺服器端實現:
(1)目錄結構,如下圖:
三、注意事項:進程間傳遞對象必需實現Parcelable或Serializable介面
『肆』 android studio 怎麼拷貝aidl文件
android studio的AIDL服務是什麼 為了使其他的應用程序也可以訪問本應用程序提供的服務,Android系統採用了遠程過程調用(Remote Procere Call,RPC)方式來實現。與很多其他的基於RPC的解決方案一樣,Android使用一種介面定義語言(Interface Definition Language,IDL)來公開服務的介面。因此,可以將這種可以跨進程訪問的服務稱為AIDL(Android Interface Definition Language)服務。 android studio創建AIDL服務文件具體步驟如下: 1、要進行創建AIDL的介面之前,需要進行選中當前的項目的文件中,選中完成項目之後。 2、然後進行點擊Android studio菜單中的“file”的選項,就會彈出了一個下拉的菜單中“new”選項。 3、就會彈出了一個下一級的菜單中,進行選擇下一級菜單中的“AIDL”的選項。 4、就會彈出了一個菜單中,進行點擊這個菜單中的“AIDL FILE”的選項。 5、就會彈出了一個AIDL的窗口的選項,需要給介面進行添加名稱,在interface name的輸入框中進行輸入名稱,點擊”finish“的選項。 6、然後在項目中進行天機了一個aidl的文件,在該文件下中,有一個aidl的後綴的文件,其實就是一個介面文件。 實例: 伺服器端: 本例中將建立一個簡單的AIDL服務。這個AIDL服務只有一個getValue方法,該方法返回一個String類型的值。在安裝完服務後,會在客戶端調用這個getValue方法,並將返回值在TextView組件中輸出。建立這個AIDL服務的步驟如下: (1)建立一個aidl文件。在Java包目錄中建立一個IMyService.aidl文件。IMyService.aidl文件的位置如圖所示。 IMyService.aidl文件的內容如下: package cn.m9.mobile.aidl; interface IMyService { String getValue(); } IMyService.aidl文件的內容與Java代碼非常相似,但要注意,不能加修飾符(例如,public、private)、AIDL服務不支持的數據類型(例如,InputStream、OutputStream)等內容。 (2)如果IMyService.aidl文件中的內容輸入正確,ADT會自動生成一個IMyService.java文件。讀者一般並不需要關心這個文件的具體內容,也不需要維護這個文件。 (3)編寫一個MyService類。MyService是Service的子類,在MyService類中定義了一個內嵌類(MyServiceImpl),該類是IMyService.Stub的子類。MyService類的代碼如下: package cn.m9.mobile.aidl; import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MyService extends Service { public class MyServiceImpl extends IMyService.Stub { public String getValue() { return "Android is very powerful"; } } @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return new MyServiceImpl(); } } 在編寫上面代碼時要注意如下兩點: IMyService.Stub是根據IMyService.aidl文件自動生成的,一般並不需要管這個類的內容,只需要編寫一個繼承於IMyService.Stub類的子類(MyServiceImpl類)即可。 onBind方法必須返回MyServiceImpl類的對象實例,否則客戶端無法獲得服務對象。 (4)在AndroidManifest.xml文件中配置MyService類,代碼如下: 其中"cn.m9.activity.IMyService"是客戶端用於訪問AIDL服務的ID。 下面來編寫客戶端的調用代碼。首先新建一個Eclipse Android工程(TestAidlClient),並將自動生成的IMyService.java文件連同包目錄一起復制到 testAIDL_client工程的src目錄中(R文件除外). 調用AIDL服務首先要綁定服務,然後才能獲得服務對象,代碼如下: package cn.m9.mobile; import cn.m9.mobile.R; import cn.m9.mobile.aidl.IMyService; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class TestAidlClient extends Activity implements OnClickListener { /** Called when the activity is first created. */ private IMyService myService = null; private Button btnInvokeAIDLService; private Button btnBindAIDLService; private TextView textView; private static final String TAG="TestAIDLClient"; private ServiceConnection serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub myService = IMyService.Stub.asInterface(service); btnInvokeAIDLService.setEnabled(true); } @Override public void onServiceDisconnected(ComponentName arg0) { // TODO Auto-generated method stub } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService); btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService); btnInvokeAIDLService.setEnabled(false); textView = (TextView) findViewById(R.id.textview); btnInvokeAIDLService.setOnClickListener(this); btnBindAIDLService.setOnClickListener(this); } @Override public void onClick(View view) { // TODO Auto-generated method stub switch (view.getId()) { case R.id.btnBindAIDLService: //綁定AIDL服務 bindService(new Intent("cn.m9.mobile.aidl.IMyService"), serviceConnection,Context.BIND_AUTO_CREATE); break; case R.id.btnInvokeAIDLService: try{ textView.setText(myService.getValue()); } catch (Exception e) { } break; } } } 在編寫上面代碼時應注意如下兩點: 使用bindService方法來綁定AIDL服務。其中需要使用Intent對象指定AIDL服務的ID,也就是標簽中android:name屬性的值。 在綁定時需要一個ServiceConnection對象。創建ServiceConnection對象的過程中如果綁定成功,系統會調用onServiceConnected方法,通過該方法的service參數值可獲得AIDL服務對象。 首先運行AIDL服務程序,然後運行客戶端程序,單擊【綁定AIDL服務】按鈕,如果綁定成功,【調用AIDL服務】按鈕會變為可選狀態,單擊這個按鈕,會輸出getValue方法的返回值.
『伍』 怎麼弄帶伺服器端的android啊
部類中包含管理你用IDL生成的遠程過程調用需要的所有代碼。兩個內部類都實現了IBinder 介面。其中一個在本地由系統內部使用,寫代碼時可以忽略它。另一個叫做 Stub,擴展自Binder 類。作為對執行IPC調用的內部代碼補充,它包含你在RPC介面中聲明的方法。象圖中說明的那樣, 你應該繼承Stub來實現這些方法。
一般遠程過程由服務來管理(因為服務可以通知系統關於進程和它連接的其它進程的信息)。它既有aidl。服務的客戶端只有由aidl生成的介面文件。
接下來是服務和其客戶端是如何建立連接的:
服務的客戶端(為位於本地)應該實現onServiceConnected() 和onServiceDisconnected() 方法,這樣它們就可以在成功與遠程服務建立或斷開連接後收到消息。它們應該調用bindService() 來設置連接。
服務的onBind() 方法應該被實現用作根據收到的意圖(傳入bindService()的意圖),決定接受或拒絕連接。
如果連接被接受,它返回一個Stub的子類。如果服務接受了連接,Android調用客戶端的onServiceConnected() 方法並傳入一個IBinder對象,由服務管理的Stub子類的代理。通過該代理,客戶端可以調用遠程服務。
上述簡單的描述忽略了一些RPC機制的細節。更多信息參見用AIDL設計遠程介面和IBinder 類的描述。
在Android中, 每個應用程序都可以有自己的進程. 在寫UI應用的時候, 經常要用到Service. 在不同的進程中, 怎樣傳遞對象呢? 顯然, Java中不允許跨進程內存共享. 因此傳遞對象, 只能把對象拆分成操作系統能理解的簡單形式, 以達到跨界對象訪問的目的. 在J2EE中,採用RMI的方式, 可以通過序列化傳遞對象. 在Android中, 則採用AIDL的方式. 理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩.
AIDL(AndRoid介面描述語言)是一種借口描述語言; 編譯器可以通過aidl文件生成一段代碼,通過預先定義的介面達到兩個進程內部通信進程的目的. 如果需要在一個Activity中, 訪問另一個Service中的某個對象, 需要先將對象轉化成AIDL可識別的參數(可能是多個參數), 然後使用AIDL來傳遞這些參數, 在消息的接收端, 使用這些參數組裝成自己需要的對象.
AIDL的IPC的機制和COM或CORBA類似, 是基於介面的,但它是輕量級的。它使用代理類在客戶端和實現層間傳遞值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相關類.; 2. 調用aidl產生的class.
final static String SOAP_ACTION = "http://www.XXX.com";
private static final String NAMESPACE = "http://www.XXX.com/";
private static final String URL = "http://192.168.61.160/webserver/OperatingCenterService.asmx";
public static boolean isFirstLogin(String loginid)
{
/*是不是第一次登錄,是返回真*/
String url = URL + "/FirstLogin";
HttpPost request = new HttpPost(url);
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("loginid", loginid));
try {
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params,
HTTP.UTF_8);
request.setEntity(entity);
HttpResponse response = new DefaultHttpClient().execute(request);
if (response.getStatusLine().getStatusCode() == 200) {
// ParserMachine.parse_onefirstLogin是對response.getEntity()的解析過程。
return ParserMachine.parse_onefirstLogin(EntityUtils.toString(response
.getEntity()));
} else {
return false;
}
} catch (Exception e) {
return false;
}
}
『陸』 Android:AIDL的服務端和客戶端怎麼理解
AIDL用來實現遠程調用,它們是手機本地的進程和服務,並不是手機端和伺服器端。
『柒』 android 客戶端怎樣使用aidl對接服務端
使用統一的AIDL介面,必須保證包名,介面名,介面定義都一致,最好採用直接復制。
客戶端:利用Context,intent實現對Serivce的綁定和調用。
其中service中的android:name為介面的實現類所在位置。intent-filter為AIDL介面文件所在位置。在客戶端發起bind時,發送的Intent應該與intent-filter中android:name指定一致。否則會出現無法找到該介面。
IntentUIntent=newIntent("com.ipanel.upgrade.UpgradeSystem");
bindService(UIntent,Uconn,BIND_AUTO_CREATE);
使用在線伺服器編譯AIDL可能會出現問題:
【1】NoAndroid.mkinpackages/apps/UpgradeService.
需要在客戶端和服務端的工程下添加Andorid.mk文件。
【2】無法找到該AIDL文件的聲明。
需要在服務端的Android.mk中添加對AIDL的編譯。
LOCAL_SRC_FILES:=$(callall-subdir-java-files)
src/com/ipanel/properties/Properties.aidl
src/com/ipanel/upgrade/UpgradeSystem.aidl
『捌』 利用Messenger跨進程通信
Android筆記多進程通信之利用Messenger跨進程通信,
提起跨進程通信,大多數人首先會想到AIDL,AIDL,中文名稱是android介面描述語言,是android系統中用於進行跨進程通信必須了解的。其實messenger和AIDL作用一樣,都可以進行進程間通訊。它是基於消息的進程間通信,通過構建Message來在客戶端和服務端之間傳遞數據,就像Handler發送消息在子線程和UI線程發送消息那樣,還不用去寫AIDL文件。
Messenger翻譯為信使,可以在不同進程中傳遞Message對象,在Message中放入我們需要傳遞的信息,然後通過Messenger將Message傳遞給對方,就可以輕輕鬆鬆實現跨進程數據傳遞。實際上Messenger是一種輕量級的IPC(跨進程通信)方式,它的底層仍然是實現的AIDL。
此外,還支持記錄客戶端對象的Messenger,然後可以實現一對多的通信;甚至作為一個轉接處,任意兩個進程都能通過服務端進行通信。
相同點:
1.都與IPC的調用有關;
2.Messenger 是一種輕量級的 IPC方案,底層實現了AIDL,只是進行了封裝,開發的時候不用寫.aidl文件。
3.都支持實時通信;
不同點:
1. Messenger一次只能處理一個請求(串列)/AIDL一次可以處理多個請求(並行);
當您需要執行 IPC 時,為您的介面使用 Messenger 要比使用 AIDL 實現更加簡單,因為 Messenger 會將所有服務調用排入隊列,而純粹的 AIDL 介面會同時向服務發送多個請求,服務隨後必須應對多線程處理。
對於大多數應用,服務不需要執行多線程處理,因此使用 Messenger 可讓服務一次處理一個調用。如果您的服務必須執行多線程處理,則應使用 AIDL 來定義介面。
2. Messenger不支持RPC,只能通過message傳遞消息/AIDL支持RPC;
3. Messenger使用簡單,輕量級,不需要創建AIDL文件/AIDL使用復雜,需要創建AIDL文件;
服務端:
1.創建一個handler對象,並實現hanlemessage方法,用於接收來自客戶端的消息,並作處理
2.創建一個messenger,封裝handler
3.用messenger的getBinder()方法獲取一個IBinder對象,通過onBind返回給客戶端
客戶端:
1.在activity中綁定服務
2.創建ServiceConnection並在其中使用 IBinder 將 Messenger實例化
3.使用Messenger向服務端發送消息,或需要伺服器端返回消息,需要創建一個messenger,封裝handler,並將這個messenger傳遞給伺服器端。在handler中接收伺服器消息。這樣就實現了客戶端和服務端的雙向通信了。
4.解綁服務
5.服務端中在 handleMessage() 方法中接收每個 Message
創建一個service
注冊service,當然要設置在不同的進程
注意:Service在聲明時必須對外開放,即android:exported="true"
客戶端是通過綁定服務端返回的binder來創建Messenger對象,並通過這個Messenger對象來向服務端發送消息。
總結
Message中的Bundle支持多種數據類型,replyTo欄位用於傳輸Messager對象,以便進程間相互通信
Messager以串列的方式處理客戶端發來的消息,不適合有大量並發的請求
Messager方法只能傳遞消息,不能跨進程調用方法
『玖』 關於Android進程間通信
先來解釋一下AIDL,這東西其實算是提供了一種自定義客戶端和伺服器之間RPC通信協議的通用方法,並由Android的編譯器自動生成這個協議的介面實現程序,包括客戶端的interface和伺服器端的stub。
其實你的需求用AIDL和socket都可以實現,AIDL比socket強的一點就是,用它定義了協議之後,客戶端和伺服器程序直接把aidl文件拿過去就可以自動生成實現這個協議的部分框架代碼,而不需要自己重頭寫,而如果你用socket來做這個,那麼可能客戶端和伺服器端分別需要寫一些代碼來把函數調用和socket通信之間做轉換,這不光帶來工作量的增加,也增加了因為客戶端和伺服器端代碼不匹配造成的bug風險。當然,反過來說,socket也有靈活的優勢,比如你的客戶端和伺服器可以不光是Android程序,也可以是其他支持同一協議的比如linux程序。
然後說伺服器程序的啟動,其實不管用AIDL還是socket,跟伺服器啟動都是兩碼事,一般如果用service組件實現伺服器,啟動它是使用Context.startService方法,service組件自己提供了避免重復啟動的機制,與AIDL和socket無關,service啟動之後,如果是socket方式則由service程序開socket埠(但這個埠需要由其他方法通知客戶端,因為想用的埠有可能被其他程序佔用),如果是AIDL方式則什麼都不用做了。
最後說綁定,所謂AIDL的綁定,只是說在一個客戶端和一個伺服器之間建立一個連接,類似於一個資料庫的connection,或者一個socket,這個連接並不會獨占伺服器進程,伺服器可以同時接受多個客戶端的訪問請求,所以在這一點上說用AIDL和用socket沒有什麼不同。
至於最後選擇哪種實現由你自己分析決定,只是覺得如果是Android App的話,AIDL會簡單一些。