android服务程序开发,android服务(service)开发
⼀、通过startService⽅式启动的服务:(后台处理⼯作),只能通过intent传递参数,但不能与Activity交互。
服务不能⾃⼰启动,需要通过其他的应⽤程序调⽤才能启动。
启动服务的应⽤,需要的处理:
1、注册服务: //LocalService:服务的类名
2、启动服务:startService(new Intent(MainActivity.this,LocalService.class)); //此处可以通过intent给服务传递参数。使⽤这种⽅式启动的Service,当启动它的Activity被销毁时,是不会影响到它的运⾏的,这时它仍然继续在后台运⾏它的⼯作。直⾄调⽤
StopService(Intent service)⽅法时或者是当系统资源⾮常紧缺时,这个服务才会调⽤onDestory()⽅法停⽌运⾏
3、停⽌服务:stopService(new Intent(MainActivity.this,LocalService.class));
服务的处理:
1、onCreate():当服务创建时,调⽤该⽅法。
2、onStartCommand(Intent intent, int flags, int startId):当通过startService⽅法启动服务时调⽤,在此可以通过Intent获取应⽤传过来的参数
3、onDestroy():当服务通过stopService被停⽌时调⽤。
⼆、通过bindService来启动的Service(在本地同进程内与Activity交互)
绑定服务应⽤端的处理:
1、注册服务: //LocalService:服务的类名
2、创建服务连接:
//是设置服务连接,⽬的是:当服务绑定和停⽌时做⼀些处理
private ServiceConnection mConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName className, IBinder service)
制作android软件流程{//当服务连接时调⽤,并可获取服务的binder接⼝,调⽤服务在binder接⼝内定义的函数
iService=(IService)service;
public void onServiceDisconnected(ComponentName className)
{//服务停⽌时做⼀些处理}
};
3、绑定⽅式启动服务:bindService (Intent service,ServiceConnection conn, int flags) //传递服务连接器对象。
4、停⽌服务:unbindService(ServiceConnection mConnection)//指定要停⽌哪个连接器启动的服务。
服务端的处理:
1、onCreate():当服务创建时,调⽤该⽅法。
2、服务内定义binder接⼝:接⼝内有服务要提供给连接该服务客户端调⽤的⽅法
public class MyBind extends Binder implements IService{
public String getName() { return "name"; }}
3、构造服务端接⼝:private MyBind myBind=new MyBind();
4、绑定事件调⽤:当bindService时调⽤,并放回给客户端服务端接⼝
public IBinder onBind(Intent arg0)
{ return myBind; }
5、onUnbind(Intent intent):当客户端unbindService时调⽤。
整个程序的运⾏过程是这样的:点⽤户点击绑定服务按钮时Activity调⽤bindService()⽅法,然后系统就去调⽤onCreate创建服务,然后系统继续调⽤onBind()⽅法向Activity传递⼀个IBinder类型的对象, 是传递给Activity⾥的ServiceConnection⾥的
onServiceConnected(ComponentName name, IBinder service)的第⼆个参数,然后通过这个参数可
以获得IService的⽅法。进⾏本地的Activity和Service交互。
特别说明:以上两种⽅法都是在同⼀个进程⾥进⾏的,⽽且服务要同客户端应⽤⼀起打包。要实现跨进程的通信需要⽤下⾯的⽅式
三、AIDL⽅式的Service(进⾏跨进程的通信)AIDL(Android Interface Definition Language) IPC机制是⾯向对象的,轻量级的。通过AIDL定义的接⼝可以实现服务器端与客户端的IPC通信。
AIDL和服务端的编写:
1、在Eclipse 创建Android⼯程,选择不创建activity
2、在⼯程的src⽂件夹内,创建包的⽂件夹,在⽂件夹内建⽴⼀个扩展名为aidl的⽂件:
package com.thtf.svraidl;
interface IMyService {
String getValue();
}
3、eclipse ⾥的ADT会⾃动⽣成⼀个IMyService.java⽂件。
4、编写⼀个MyService类。MyService是Service的⼦类,在MyService类中定义了⼀个内嵌类(MyServiceImpl),该类是IMyService.Stub的⼦类。MyService类的代码如下:
public class MyService extends Service
{
public class MyServiceImpl extends IMyService.Stub
{
public String getValue() throws RemoteException
{
return "aidl服务⽅法";
}
}
public IBinder onBind(Intent intent)
{
return new MyServiceImpl();
}
}
说明:在编写上⾯代码时要注意如下两点:IMyService.Stub是根据IMyService.aidl⽂件⾃动⽣成的,⼀般并不需要管这个类的内容,只需要编写⼀个继承于IMyService.Stub类的⼦类(MyServiceImpl类)即可。 onBind⽅法必须返回MyServiceImpl类的对象实例,否则客户端⽆法获得服务对象。
5、在l⽂件中配置MyService类,代码如下:
注意:action⾥的包名和接⼝名不要写错。
客户端的编写:
1、新建⼀个Eclipse Android⼯程(svraidlclient),并将⾃动⽣成的IMyService.java⽂件连同包⽬录⼀起
复制到⼯程的src⽬录中
2、把AISL接⼝导⼊进来:import com.thtf.svraidl.IMyService。
3、创建服务连接,并在服务连接的时候,获取服务对象:
private IMyService myService = null;
private ServiceConnection serviceConnection = new ServiceConnection()
{
public void onServiceConnected(ComponentName name, IBinder service)
{
// 获得服务对象
myService = IMyService.Stub.asInterface(service);
}
}
4、绑定的⽅式启动服务:
// 绑定AIDL服务
bindService(new Intent("com.thtf.svraidl.IMyService"), serviceConnection, Context.BIND_AUTO_CREATE);
5、调⽤服务的⽅法:Value()
四、APK包之间调⽤(类似服务的进⾏跨进程通信,可以传递参数,获取结果,但不能调⽤⽅法)
例如,A apk传递参数给B apk并获取B返回的数据,实现如下:
A apk的处理:
Intent intent = new Intent(); //创建⼀个通信意图
intent.setClassName("com.thtf", "com.thtf.PermitActivity"); //设置要同哪个类通信
intent.putExtra("filename", "泰囧"); //通信意图内放置要传递的参数
startActivityForResult(intent, 0);//启动要通信的activity
//等待返回结果处理事件
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
if (resultCode == RESULT_OK)//判断返回码是否正确
{
Bundle extras = Extras();//通过意图获取返回的数据
String result = "结果:" +String("retvalue");//提取数据
}
}
B apk的处理:
public void onCreate(Bundle savedInstanceState)
{
setContentView(R.layout.main);
Bundle extras = getIntent().getExtras();//获得意图传递的参数
if(extras != null)
{
String filename = String("filename");//获取参数值
String retvalue = invokeWs(filename);//根据参数值进⾏事务处理,并返回处理的结果//组成标准intent参数
Bundle bundle = new Bundle();
bundle.putString("retvalue", retvalue);
//新建intent,并把参数放⼊其中
Intent intent = new Intent();
intent.putExtras(bundle);
// 设置要返回的intent,给调⽤者
setResult(RESULT_OK, intent);
}
finish();
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论