Service Ability 原创
基本概念
基于Service模板的Ability主要用于【后台运行任务】,【不提供】用户交互界面。Service是【单实例】的。在一个设备上,相同的Service只会存在一个实例。
回调方法
onStart()
该方法在【创建】Service【的时候】++调用++,用于Service的初始化。在Service的整个生命周期只会调用一次,调用时传入的Intent应为空。
onCommand()
在Service【创建完成之后】++调用++,该方法在客户端每次启动该Service时都会调用,用户可以在该方法中做一些调用统计、初始化类的操作。
onConnect()
在【Ability和Service 连接时调用】,该方法返回IRemoteObject对象,用户可以在该回调函数中生成对应Service的IPC通信通道,以便Ability与Service交互。Ability可以多次连接同一个Service,系统会缓存该Service的IPC通信对象,只有第一个客户端连接Service时,系统才会调用Service的onConnect方法来生成IRemoteObject对象,而后系统会将同一个RemoteObject对象传递至其他连接同一个Service的所有客户端,而无需再次调用onConnect方法。
onDisconnect()
在Ability与绑定的Service断开连接时++调用++。
onStop()
在Service销毁时++调用++。Service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。
案例
在MainAbilitySlice的代码
public class MainAbilitySlice extends AbilitySlice {
private static final HiLogLabel label = new HiLogLabel(HiLog.LOG_APP, 0xFFFFF, "CHXI");
@Override
public void onStart(Intent intent) {
Intent myIntent = new Intent();
//设置操作
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
//包名
.withBundleName("com.chxi.servicestu")
//全类名 或者 class文件
.withAbilityName(ServiceAbility.class)
.build();
myIntent.setOperation(operation);
//启动serviceAbility
startAbility(myIntent);
//1、创建连接Service回调实例
IAbilityConnection connect = new IAbilityConnection() {
@Override
public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int i) {
HiLog.info(label,"MyConnectAbilitySlice::ConnectDone");
HiLog.info(label,""+i);
}
@Override
public void onAbilityDisconnectDone(ElementName elementName, int i) {
HiLog.info(label,"MyConnectAbilitySlice::DisconnectDone");
}
};
//2、连接
connectAbility(myIntent, connect);
//3、断开连接
disconnectAbility(connect);
super.setUIContent(ResourceTable.Layout_ability_main);
}
@Override
public void onActive() {
super.onActive();
}
@Override
public void onForeground(Intent intent) {
super.onForeground(intent);
}
}
ServiceAbility代码
public class ServiceAbility extends Ability {
private static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0xFFFFF, "CHXI");
// 创建自定义IRemoteObject实现类
class MyRemoteObject extends LocalRemoteObject {
private int remoteNum = 0;
MyRemoteObject(){
remoteNum = 111;
HiLog.info(LABEL_LOG, "ServiceAbility::MyRemoteObject");
}
public int getRemoteNum() {
return remoteNum;
}
}
// 把IRemoteObject返回给客户端
@Override
protected IRemoteObject onConnect(Intent intent) {
HiLog.info(LABEL_LOG, "ServiceAbility::onConnect");
return new MyRemoteObject();
}
@Override
public void onStart(Intent intent) {
HiLog.info(LABEL_LOG, "ServiceAbility::onStart");
super.onStart(intent);
}
@Override
public void onBackground() {
super.onBackground();
HiLog.info(LABEL_LOG, "ServiceAbility::onBackground");
}
@Override
public void onStop() {
super.onStop();
HiLog.info(LABEL_LOG, "ServiceAbility::onStop");
}
@Override
public void onCommand(Intent intent, boolean restart, int startId) {
HiLog.info(LABEL_LOG, "ServiceAbility::onCommand");
}
@Override
public void onDisconnect(Intent intent) {
HiLog.info(LABEL_LOG, "ServiceAbility::onDisconnect");
}
}
1、初始化service 调用 onStart
2、初始化完成后 调用 onCommand
3、连接服务与断开连接服务 最后调用stop之前,推到后台调用onbackground。
前台Service 代码 在serviceAbility里面的onstart()里面调用
//创建通知请求 设置通知id为1005
NotificationRequest request = new NotificationRequest(1005);
//创建普通通知
NotificationRequest.NotificationNormalContent content = new NotificationRequest.NotificationNormalContent();
//设置通知的标题和内容
content.setTitle("Title").setText("Text");
//创建通知内容
NotificationRequest.NotificationContent notificationContent = new NotificationRequest.NotificationContent(content);
//设置通知
request.setContent(notificationContent);
keepBackgroundRunning(1005,request);
HiLog.error(MyUtils.getLabel(), "ServiceAbility::startupForegroundService");