
根据对方提供的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启动流程等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)