我在一个项目中要求使用.NET网站为android应用程序配置主题。我的选择是实现一个从android应用程序到服务器的轮询服务,该服务经常轮询以查看是否需要任何更改。是否有任何一种更好的方式或方法可以将数据从网站发送到android应用程序,而不是应用程序频繁轮询网站服务器
一种更好但更复杂的方法是使用谷歌云消息(也称为推送通知)。
这样,你的服务器就可以通知应用程序有新的数据要检索,只有这样你的应用程序才能查询你的服务器。
这是一种对电池更友好的方法,效果非常好。出于同样的原因,我以前也用过这个。
为了回答一些评论,投票是个坏主意,因为
- 它毫无理由地过度使用您的服务器和用户的设备
- 它会耗尽用户的电池电量
- 服务器想要与应用程序通信的时间和应用程序进行下一次轮询的时间之间总是会有一些延迟
推送通知方法需要付出更多的努力,但也有很大的优势。
我会试试这个:
- 服务器正在侦听特定的IP/端口,并等待TCP连接(使用套接字)
- Android使用TCP数据包连接到服务器,服务器现在知道Android IP
- Android处于接收周期(使用超时的TCP套接字)
- 服务器将数据发送到Android IP
- Android从服务器接收数据
但很明显,首先安卓需要让服务器知道它的存在。您还需要为自己的服务器编写代码。
我正在通过一台服务器为中继服务做这样的事情,该服务器充当我的Android应用程序和能量测量电子设备之间的桥梁。
嗨,互联网上有很多关于这方面的教程。但无论如何,我发布代码是为了演示如何从android调用web服务。。。此代码只调用SOAP web服务。要调用JSON、REST等其他web服务,请在网上搜索自己。
public class HelloWebService extends Activity{
String SOAP_ACTION="http://tempuri.org/HelloWorld";
String METHOD_NAME = "HelloWorld";
String NAMESPACE = "http://tempuri.org/";
String URL = "http://192.168.1.15:80/himanshu/helloworldwebservice.asmx";
String SUM_SOAP_ACTION="http://tempuri.org/AddNumbers";
String METHOD_NAME1 = "AddNumbers";
TextView tv1,tv2,tv3,tv4,tv5;
EditText etA,etB,etName;
Button bt,dis;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.hello);
etName = (EditText)findViewById(R.id.et);
tv1 = (TextView)findViewById(R.id.tv1);
tv2 = (TextView)findViewById(R.id.tv2);
tv3 = (TextView)findViewById(R.id.tv3);
tv4 = (TextView)findViewById(R.id.tv4);
tv5 = (TextView)findViewById(R.id.tv5);
etA = (EditText)findViewById(R.id.editA);
etB = (EditText)findViewById(R.id.editB);
bt = (Button)findViewById(R.id.add);
dis = (Button)findViewById(R.id.display);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sum();
}
});
dis.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Hello();
}
});
}
public void Hello(){
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
Log.d("request", request.toString());
String str = etName.getText().toString();
Log.d("str", str);
request.addProperty("name", str);
Log.d("request", request.toString());
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
Log.d("envelope", envelope.toString());
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
Log.d("envelope", envelope.toString());
HttpTransportSE aht = new HttpTransportSE(URL);
aht.debug=true;
Log.d("aht", aht.toString());
try
{
aht.call(SOAP_ACTION, envelope);
SoapPrimitive results = (SoapPrimitive)envelope.getResponse();
Log.d("result", results.toString());
tv1.setText(""+results.toString());
}
catch (Exception e)
{
tv2.setText(e.getClass().toString());
Log.d("Error",e.getClass().toString());
}
}
public void sum(){
SoapObject sum_request = new SoapObject(NAMESPACE, METHOD_NAME1);
Log.d("sum_request", sum_request.toString());
//PropertyInfo pro1 = new PropertyInfo();
String strA = etA.getText().toString();
String strB = etB.getText().toString();
sum_request.addProperty("a", strA);
sum_request.addProperty("b", strB);
Log.d("sum_request", sum_request.toString());
SoapSerializationEnvelope sum_envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
Log.d("sum_envelope", sum_envelope.toString());
sum_envelope.dotNet = true;
sum_envelope.setOutputSoapObject(sum_request);
Log.d("sum_envelope", sum_envelope.toString());
HttpTransportSE sum_aht = new HttpTransportSE(URL);
sum_aht.debug=true;
Log.d("sum_aht", sum_aht.toString());
try
{
sum_aht.call(SUM_SOAP_ACTION, sum_envelope);
SoapPrimitive sum_results = (SoapPrimitive)sum_envelope.getResponse();
Log.d("sum_result", sum_results.toString());
// int in = Integer.parseInt(sum_results.getProperty(0).toString());
tv3.setText(""+sum_results.toString());
}
catch (Exception e)
{
tv3.setText(e.getClass().toString());
Log.d("sum_error", e.getClass().toString());
}
}
}