‘壹’ 如何简单使用代理服务器上网
方法/步骤 如何获取免费代理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会简单一些。