我想远程调用webservice接口,对方提供了wsdl地址和服务名方法名,该怎么获取它的数据呢

我想远程调用webservice接口,对方提供了wsdl地址和服务名方法名,该怎么获取它的数据呢,第1张

根据对方提供的wsdl地址你可以生成客户端类,用wsdl2java(搜索“wsdl生成客户端代码”),你用myeclipse的话参考这个:>

调用方法

Service1 service = new Service1();  

Service1Soap soap = servicegetService1Soap();  

Systemoutprintln(soapgetProjectInfo());  //本地方法

//不明白的再追问,望采纳

   MainActivity 通过 startActivityForResult 启动 MainActivity2 ,同时传递一个 Bundle 对象给 MainActivity2 ,在 MainActivity2 中通过 getIntent 获取到传递过来的 Bundle ,进而得到 MainActivity 传递过来的String 数据并打印。

  在 MainActivity2 中通过 setResult 设置需要传递给 MainActivity 的 Bundle 数据,在 MainActivity 的 onActivityResult 函数中就可以得到相关的 Bundle 数据。

  每一个Android应用都有一个 Application 对象,这个 Application 会贯穿整个Android应用,在其中定义的变量,它的生命周期也是和整个应用的生命周期一样。

  在 MainActivity 中定义了一个 伴生变量 ,它相当于 Java中的静态变量 ,而在 MainActivity2 中可以获取此静态变量,并对其进行修改。

  通过 Fragment 的 setArguments(bundle) 实现 Activity 想 Fragment 传值。

  通过 onAttach(activity: Activity) 方法获得 activity 实例,直接调用 activity 中的方法获得数据。

   Service 的 onBind 方法需要返回一个 Binder 对象,而这个对象在 ServiceConnectiononServiceConnected 中可以获取,从而实现 Service 和 Activity 之间的通信。

   startService 时,传入参数 intent 可以携带部分参数给 Service ,我们可以在 Service 的 onStartCommand 方法中得到 startService 传递过来的 intent 数据。

  在service中持有 callback 接口,并在binder中定义方法得到service的实例。activity中实现 ServiceConnection ,通过绑定启动service,这样会回调 ServiceConnection 接口的 onServiceConnected 方法,从而得到service实例,对service中的 callback 进行赋值,在service中可进行耗时 *** 作并见数据通过callback接口,传递给activity进行其他 *** 作。

除了上面说的常用方法外,还有很多其他方法,比如广播机制,事件总汇(eventbus)等。

相关源码:

启动Service有两种方式,一种是 startService ,一种是 bindService 。其中startService和bindService会分别执行不同的方法。如startService会执行 onStartCommand 方法,而bindService会执行 onBind、onUnbind 方法。

其中 startService 的启动方式是不能进行通信的,而且其Service的生命周期不跟调用方同步。 binderService 启动方式则可以通过Binder进行通信。一下是startService的流程图:

startServiceCommon 方法先检查Intent,然后通过Binder通信调用 AMSstartService 方法,其中参数 mMainThreadgetApplicationThread() 是一个Binder,AMS通过其和调用端进行通信,其过程如下所示:

在startService的过程中 ActivityManagerServer 的作用大致是找到对应的Servive并调用其生命周期。

AMSstartService 方法作了一下调用端进程的检查后,直接调用 ActiveServicesstartServiceLocked 方法,并把参数全部传递给 ActiveServices 类。

ActiveServicesstartServiceLocked 方法会获取调用端的ProcessRecord,和获取被调用端的 ServiceRecord、ProcessRecord 查看此次启动的Service是否要加入延迟队列。最终调用 startServiceInnerLocked 方法继续执行逻辑。

获取Service所对应的进程,如果进程创建成功而且不延迟启动,则调用 realStartServiceLocked 方法调用Service的一些方法。

realStartServiceLocked 方法,分别会调用 appthread 所对应的scheduleCreateService、scheduleServiceArgs,此appthread是Service所在进程的ApplicationThread类。在调用方法前,还会调用 bumpServiceExecutingLocked 方法发送一个延迟消息,如果这个消息没被取消,则会dANR。

先会创建一个 ContextImpl 对象,在通过反射创建 Service对象 ,通过调用 Serviceattach 方法将资源传给Service对象,最后调用 ServiceonCreate 对象,并向AMS发送取消延迟发送消息。

根据缓存找到对应的 Service ,并执行 Service onStartCommand() 方法,并向AMS发送了取消ANR的延迟消息。

在来看看stopService会发生什么:

执行 ServiceonDestroy 方法,并对Service和对应ContextImpl进行clear *** 作。startService启动的Service的生命周期并不会跟调用端同步,所以要自己手动调用停止 *** 作: stopSelf()或stopService()

activity可以 *** 作service了,我们还需要service能 *** 作activity。

我觉得可以有3中方式:

1直接把activity传给service,service通过activity实例随便 *** 作activity

2使用接口回调方式,activity实现相应的接口,service通过接口进行回调,比较灵活

3使用广播

使用广播是比较常见的方式,我们就不具体讲解了,下面我们介绍前面2中方法,具体看代码,用service更新seekbar。

我们的activity代码:

[html] view plain copy

package comhckbindservice;

import androidappActivity;

import androidcontentComponentName;

import androidcontentIntent;

import androidcontentServiceConnection;

import androidosBundle;

import androidosIBinder;

import androidutilLog;

import androidviewView;

import androidwidgetSeekBar;

import androidwidgetToast;

import comhckbindserviceMyServiceMyBuild;

public class MainActivity extends Activity {

private MyService myService; //我们自己的service

private SeekBar pBar; //模拟service更新进度条

private ConnectionService connectionService;

@Override

protected void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

setContentView(Rlayoutmain);

pBar = (SeekBar) findViewById(Ridseekbar);

connectionService=new ConnectionService();

}

public void startService(View view) { //绑定service

bindService(new Intent(this,MyServiceclass), connectionService, 1);

}

/

@author Administrator

实现service接口,用于service绑定时候,回调

/

class ConnectionService implements ServiceConnection

{

@Override

public void onServiceConnected(ComponentName name, IBinder service) {

myService=((MyBuild)service)getMyService(); //获取Myservice对象

/

直接把当前对象传给service,这样service就可以随心所欲的调用本activity的各种可用方法

/

myServicesetMainActivity(MainActivitythis); //把当前对象传递给myservice

/

使用一个接口来实现回调,这样比上面方法更加灵活,推荐

/

// myServicesetOnProgressBarListener(new UpdateProgressListener() {

//

// @Override

// public void updateBar(int size) {

// updateBar(size);

// }

// });

}

@Override

public void onServiceDisconnected(ComponentName name) {

}

}

/

@param size

更新seekbar

/

public void updateBar(int size)

{

pBarsetProgress(size);

}

/

@param view

开始更新seekbar

/

public void startBar(View view) {

if (myService==null) {

ToastmakeText(this, "请先开始service", ToastLENGTH_LONG)show();

}

else {

myServicestartUpdateProgress();

}

}

/

@param view

停止更新seekbar

/

public void stopBar(View view) {

if (myService==null) {

ToastmakeText(this, "更新没有开始", ToastLENGTH_LONG)show();

}

else {

myServicestopUpdateProgress();

}

}

/

@param view

停止service

/

public void stopService(View view) {

myService=null;

unbindService(connectionService);

}

@Override

protected void onDestroy() {

superonDestroy();

try {

unbindService(connectionService);

} catch (Exception e) {

}

}

}

重要代码是onServiceConnected回调方法里面

myService=((MyBuild)service)getMyService(); //获取Myservice对象

获取service对象后,我们想怎么 *** 作它都行了,比如上面的,把activity实例直接通过它的方法传递过去,便于

service调用activity的各种方法。或者,设置传递一个回调接口对象过去,用户回调

service代码:

[html] view plain copy

package comhckbindservice;

import androidappService;

import androidcontentIntent;

import androidosBinder;

import androidosHandler;

import androidosIBinder;

import androidutilLog;

public class MyService extends Service{

private int size=0;

private UpdateProgress updateProgress;

private final long TIME=2000;

private boolean isUpdate=true;

private MainActivity activity;

private UpdateProgressListener listener;

@Override

public IBinder onBind(Intent intent) {

return new MyBuild();

}

@Override

public void onCreate() {

superonCreate();

updateProgress=new UpdateProgress();

}

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

return superonStartCommand(intent, flags, startId);

}

/

@author Administrator

线程用来改变seekbar进度的大小

/

class UpdateProgress implements Runnable

{

@Override

public void run() {

if (isUpdate) {

size+=10;

if (size>100) {

size=0;

}

handlersendEmptyMessage(0);

}

}

}

/

调用更新相应方法,更新进度条

/

Handler handler=new Handler()

{

public void handleMessage(androidosMessage msg) {

/

直接调用activity对象里面的方法

/

if (activity!=null) {

activityupdateBar(size);

}

/

使用接口回调

/

// if (listener!=null) {

// listenerupdateBar(size);

// }

handlerpostDelayed(updateProgress, TIME);

};

};

/

停止更新

/

public void stopUpdateProgress()

{

isUpdate=false;

}

/

开启更新

/

public void startUpdateProgress()

{

if (!isUpdate) {

handlerpost(updateProgress);

}

isUpdate=true;

}

public void onDestroy() {

isUpdate=false;

};

/

@param activity

初始化MainActivity对象

/

public void setMainActivity(MainActivity activity)

{

thisactivity=activity;

}

/

@param listener

初始化UpdateProgressListener对象

/

public void setOnProgressBarListener(UpdateProgressListener listener)

{

thislistener=listener;

}

/

@author Administrator

使用类部类,返回当前service的实例,用于activity,调用service的各种方法

/

class MyBuild extends Binder

{

public MyService getMyService()

{

return MyServicethis;

}

}

}

service里面最重要的就是,最下面我们的MyBuild类部类了,通过它的getMyService方法,获取service的实例

该类的实例实在onBind时候,我们返回给activity的。

接口:

[html] view plain copy

package comhckbindservice;

public interface UpdateProgressListener {

public void updateBar(int size);

}

一个简单接口,用于service回调activity

上面是使用 bindService来启动service的,那么如果我们使用startService启动service时候,上面的办法就不行了。

因为onBind不会执行,我们获取不到IBinder实例。这个时候,我们可以使用设计模式的观察者模式来处理。

以上就是关于我想远程调用webservice接口,对方提供了wsdl地址和服务名/方法名,该怎么获取它的数据呢全部的内容,包括:我想远程调用webservice接口,对方提供了wsdl地址和服务名/方法名,该怎么获取它的数据呢、Android四大组件之Activity(2)组件间通信、startService启动流程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/10102486.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存