android studio连接visual studio开发的程序主要分为两部分:第一部分是先在visual studio端开发一个webservice服务,第二部分是在android studio端调用webservice端的服务。
android studio版本:android-studio-ide-141.2178183-windows
visual studio 版本:visual studio 2012
文件-》新建-》网站-》Asp .Net空网站
添加新项
先择Web服务
呈现如下图所示状态。在这里可以看到一个HelloWorld()函数,这个函数返回一个字符串”Hello world”,我们在Android studio中要做的是把这个”Hello world”字符串显示在手机上。同时在这里也可以返回数据库中的数据,显示到手机上,可以参考一下http://blog.csdn.net/zhyl8157121/article/details/8169172这篇文章。本文也是参考的这篇文章,只是所用平台不一样。
这时候执行一下会在浏览器中看到如下画面:
下面我将这个网站发布一下(有关内容可以百度一下win7 IIS的配置以及网站发布等有关知识)。另外电脑开visual studio 和 android studio两个软件实在是卡,发布完了之后就可以将visual studio关了,直接在浏览器中访问了。
以下部分内容参考<<疯狂Android讲义>>
1. 新建一个android空项目,最小SDK:API 15: Android 4.0.3
2. Google为Android平台开发Web Service客户端提供了ksoap2-android项目,但这个项目并未直接集成在Android平台中,还需要开发人员自行下载。为Android应用增加ksoap2-android运行请按如下步骤进行:
1.1 登录http://simpligility.github.io/ksoap2-android/getting-started.html站点,下拉一直到如下界面。(另:再见,Google Code,你好,GitHub)
此时最新为3.5.0,我下载的是3.3.0。
1.2 切换到Project面板
将ksoap2JAR包直接复制粘贴到app->libs目录下
右键Add as Library…,弹出对话框,OK就行了。
3. 先在activity_main.xml中添加一个按钮。代码如下:
"http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
design界面如下图所示:
4. MainActivity.java
package com.tudou.demo;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private Button btn1;
private String result;
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
switch(msg.what){
case 0:
Toast.makeText(MainActivity.this, "连接服务器失败", Toast.LENGTH_LONG).show();
case 1:
Toast.makeText(MainActivity.this, result, Toast.LENGTH_LONG).show();
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.btn1);
btn1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
BtnClick();
}
});
}
private void BtnClick() {
final String SERVICE_NS = "http://tempuri.org/";//命名空间
final String SOAP_ACTION = "http://tempuri.org/HelloWorld";//用来定义消息请求的地址,也就是消息发送到哪个操作
final String SERVICE_URL = "http://110.240.192.182/WebService.asmx";//URL地址,这里写发布的网站的本地地址
String methodName = "HelloWorld";
//创建HttpTransportSE传输对象,该对象用于调用Web Service操作
final HttpTransportSE ht = new HttpTransportSE(SERVICE_URL);
ht.debug = true;
//使用SOAP1.1协议创建Envelop对象。从名称上来看,SoapSerializationEnvelope代表一个SOAP消息封包;但ksoap2-android项目对
//SoapSerializationEnvelope的处理比较特殊,它是HttpTransportSE调用Web Service时信息的载体--客户端需要传入的参数,需要通过
//SoapSerializationEnvelope对象的bodyOut属性传给服务器;服务器响应生成的SOAP消息也通过该对象的bodyIn属性来获取。
final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//实例化SoapObject对象,创建该对象时需要传入所要调用的Web Service的命名空间、Web Service方法名
SoapObject soapObject = new SoapObject(SERVICE_NS, methodName);
//对dotnet webservice协议的支持,如果dotnet的webservice
envelope.dotNet = true;
//调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为
//SoapSerializationEnvelope的付出SOAP消息体
envelope.bodyOut = soapObject;
new Thread(){
@Override
public void run() {
try {
//调用WebService,调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程Web Service
ht.call(SOAP_ACTION, envelope);
if(envelope.getResponse() != null){
//获取服务器响应返回的SOAP消息,调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个
//SoapObject对象,该对象就代表了Web Service的返回消息。解析该SoapObject对象,即可获取调用Web Service的返回值
SoapObject so = (SoapObject) envelope.bodyIn;
//接下来就是从SoapObject对象中解析响应数据的过程了
result = so.getPropertyAsString(0);
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
}
else{
Message msg=new Message();
msg.what=0;
handler.sendMessage(msg);
}
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
}.start();
}
}
还有一步非常重要的步骤,就是在AndroidManifest.xml文件中添加对internet的访允许:Android.Manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tudou.demo" >
<uses-permission android:name="android.permission.INTERNET">uses-permission>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
application>
manifest>
另外这里有几个问题想说一下:
1. 可能是在android2.3以上的版本中,必须将访问网络的代码写在一个新的线程中。也就是我访问网络的代码ht.call()写入了一个新线程的原因。
2. 如果想知道SOAP协议是什么样子的,可以直接在发布网站上的WebService页面点击一个方法名,在页面下方就可以看到SOAP各版本的请求及响应信息。这里列一个SOAP1.1版本的。
POST /WebService.asmx HTTP/1.1
Host: 10.204.92.182
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://tempuri.org/HelloWorld"
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<HelloWorld xmlns="http://tempuri.org/" />
soap:Body>
soap:Envelope>
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<HelloWorldResponse xmlns="http://tempuri.org/">
<HelloWorldResult>stringHelloWorldResult>
HelloWorldResponse>
soap:Body>
soap:Envelope>
OK,到这里就完了。^_^