Service 笔记:
startService方式开启服务:
1、创建服务类MyService extends Service
2、写入清单文件
<service android:name="com.example.ct.MyService">
<intent-filter>
<action android:name="ct.example.myService" />
</intent-filter>
</service>
3、startService 和 StopService开启和关闭服务。
Intent intent = new Intent();
intent.setAction("ct.example.myService");
startService(intent);
Intent intent = new Intent(getApplication(), MyService.class);
stopService(intent);
bindService 方式开启服务:
前面1、2步骤相同。直接第三步骤:
bindService 和UnbindService 开启和关闭服务:该方法可以重service中返回一个Binder内部类。开启服务者通过获取该Binder类来调用服务的内部方法。
开启:Intent intent = new Intent(getApplication(), MyService.class);
conn=new Conn();
bindService(intent,conn,BIND_AUTO_CREATE);//BIND_AUTO_CREATE when the service is not exist,while create it.
private class Conn implements ServiceConnection {
@Override//when bind the service success. callback
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyLog.i("ct", "==============onServiceConnected");
bind= (ServiceInterface) iBinder;//this class can let us use the service's methods.
bind.method1();
}
@Override//
public void onServiceDisconnected(ComponentName componentName) {
bind=null;
MyLog.i("ct", "==============onServiceDisconnected");
}
}
Conn 中的复写方法是当service连接成功失败后调用的。
Service中的onbind方法
public IBinder onBind(Intent intent) {//when bindService start the service.
MyLog.i("ct", "==============onBind");
return new MyBind();
}
返回的 MyBind就是Conn 中的onServiceConnected 中的iBinder,通过该iBinder来调用服务的私有方法。下面试MyBInd()代码
//for expose the private methods to others class who bindService.
private class MyBind extends Binder implements ServiceInterface{
@Override
public void method1() {
method();
}
@Override
public void method2() {
method();
}
}
private void method() {
MyLog.i("ct", "==============this is method in Myservice");
}
3、服务生命周期:
1、第一种开启方式:
startService(开启后与调用者无关。开启者挂掉后然在后台执行,不能调用服务中的私有方法)
--> onCreate()(只有第一次创建才调用)--> onStartCommand()-->onStart()(已经过时);
StopService 关闭--> onDestroy()
2、bindService 方式开启:当绑定该service的activity destroy时该service挂掉。
bindService -->onCreate()(第一次调用创建) --> onBind()(返回一个Binder内部类到 开启服务的onServiceConnected方法通过该binder类来调用service中的私有方法 )
unbindService-->onUnbind()-->onDestroy(){当该service被杀死后 调用开启activity的onServiceDisconnected}
3、当服务中的内部类不希望将自身暴露自身私有方法时则定义一个接口,将需要暴露的方法写入到接口的方法中。
4、开启远程服务: 两个应用程序间的通讯
1、远程服务:调用者和服务在不同的工程代码里面。
2、本地服务:调用者和服务在同一个工程代码里面。
进程操作系统是分配内存空间的一个单位。进程的数据是独立的,是一个独立的内存空间。不同的进程是通过操作系统分配的公共内存空间来进行通讯的。
aidl:Android interface definition language -----Android接口定义语言。
1、在远程服务的清单文件中service下注册<intent-filter>
<action android:name="ct.example.MyInternetService" />
</intent-filter>
2、选择app-->new aidl文件。会自动创建到 project模式下main中。
在文件中定义接口的方法,然后通过rebuild编译项目,()在project模式下可以看见找到自动生成的Java接口。在app --build--generated-source--aidl--debug下
当需要添加接口中的方法时。先将debug下自动生成的文件删除。向aidl文件中写入方法后。在rebuild自动生成Java接口。
3、将该aidl文件拷贝的需要调用该服务的应用的main下。rebuild自动生成Java接口文件。。在有bindService方式开启服务。即可完成调用其他应用的方法。
4、ServiceConnection中 用接口类型来接收Binder类。。
如:IMyAidlInterface myBinder = IMyAidlInterface.Stub.asInterface(iBinder);然后就可以调用远程服务中的方法了。
下面是调用远程服务代码。
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("ct.example.MyInternetService");
//intent.setPackage("com.example.ct");
bindService(intent, new Conn(), BIND_AUTO_CREATE);
}
});
private class Conn implements ServiceConnection
{
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
MyLog.i("ct","DialogTestActivity InternetService connection success=============");
IMyAidlInterface myBinder = IMyAidlInterface.Stub.asInterface(iBinder);
try {
myBinder.add(12, 12);
} catch (RemoteException e) {
MyLog.i("ct","service error=============");
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
MyLog.i("ct","DialogTestActivity InternetService connection error=============");
}
}