super.oncreate();
}
@override
public int onstartcommand(intent intent, int flags, int startid) {
return super.onstartcommand(intent, flags, startid);
}
@nullable
@override
public ibinder onbind(intent intent) {
return null;
}
@override
public boolean onunbind(intent intent) {
return super.onunbind(intent);
}
@override
public void ondestroy() {
super.ondestroy();
}
}
初始化:
- onstart():harmonyos创建service的时候调用,用于service的初始化,在service的整个生命周期只会调用一次。
- oncreate():android首次创建服务时,系统会(在调用 onstartcommand() 或 onbind() 之前)调用此方法来执行一次性设置程序。如果服务已在运行,则不会调用此方法。
启动:
- oncommand():harmonyos在service创建完成之后调用,该方法在客户端每次启动该service时都会调用,用户可以在该方法中做一些调用统计、初始化类的操作。
- onstartcommand() :android中当另一个组件(如 activity)请求启动服务时,系统会通过调用 startservice() 来调用此方法。执行此方法时,服务即会启动并可在后台无限期运行。实现此方法,则在服务工作完成后,则通过调用 stopself() 或 stopservice() 来停止服务。(如果只想绑定,则无需实现此方法。)
绑定:
- onconnect():harmonyos中在ability和service连接时调用,该方法返回iremoteobject对象,用户可以在该回调函数中生成对应service的ipc通信通道,以便ability与service交互。ability可以多次连接同一个service,系统会缓存该service的ipc通信对象,只有第一个客户端连接service时,系统才会调用service的onconnect方法来生成iremoteobject对象,而后系统会将同一个remoteobject对象传递至其他连接同一个service的所有客户端,而无需再次调用onconnect方法。
- onbind():android中当另一个组件想要与服务绑定(例如执行 rpc)时,系统会通过调用 bindservice() 来调用此方法。在此方法的实现中,开发者必须通过返回 ibinder 提供一个接口,以供客户端用来与服务进行通信。请务必实现此方法;但是,如果开发者并不希望允许绑定,则应返回 null。
解绑:
- ondisconnect() :harmonyos中在ability与绑定的service断开连接时调用。
- onunbind():android中客户端可通过调用 unbindservice() 关闭连接。多个客户端可以绑定到相同服务,而且当所有绑定全部取消后,系统即会销毁该服务。(服务不必自行停止运行。)
销毁:
- onstop():harmonyos中在service销毁时调用。service应通过实现此方法来清理任何资源,如关闭线程、注册的侦听器等。
- ondestroy():android中当不再使用服务且准备将其销毁时,系统会调用此方法。服务应通过实现此方法来清理任何资源,如线程、注册的侦听器、接收器等。这是服务接收的最后一个调用。 总而言之,不管是harmonyos还是android,有关service的生命周期及相关方法调用及方法作用基本一致。
使用
创建service
harmonyos:创建ability的子类,实现service相关的生命周期方法。service也是一种ability,用户可以重写这些方法来添加自己的处理。
public class harmonyosservice extends ability {
@override
public void onstart(intent intent) {
super.onstart(intent);
}
…
}
android:创建 service 的子类(或使用它的一个现有子类)。开发者需要重写一些回调方法,从而处理服务生命周期的某些关键方面,并提供一种机制将组件绑定到服务。
public class androidservice extends service {
@override
public void oncreate() {
super.oncreate();
}
…
}
或者创建intentservice(service 子类)子类,串行执行所有启动服务请求。
public class androidintentservice extends intentservice {
public androidintentservice() {
super(“androidintentservice”);
}
@override
protected void onhandleintent(intent intent) {
try {
thread.sleep(5000);
} catch (interruptedexception e) {
// restore interrupt status.
thread.currentthread().interrupt();
}
}
}
注册
harmonyos:service需要在应用配置文件中进行注册,注册类型type需要设置为service。
{
“module”: {
“abilities”: [
{
“name”: “.serviceability”,
“type”: “service”,
“visible”: true
…
}
]
…
}
…
}
android:开发者必须在应用的清单文件中声明所有服务。如要声明服务,需要添加 元素作为 元素的子元素,name属性是唯一必需的属性。
<manifest … >
…
<application … >
…
启动服务
harmonyos
harmonyos中ability为开发者提供了startability()方法来启动另外一个ability。因为service也是ability的一种,开发者同样可以通过将intent传递给该方法来启动service。不仅支持启动本地service,还支持启动远程service。其中启动本地服务如下:
intent intent = new intent();
operation operation = new intent.operationbuilder()
.withdeviceid(“”)
.withbundlename(“com.huawei.hiworld.himusic”)
.withabilityname(“com.huawei.hiworld.himusic.entry.serviceability”)
.build();
intent.setoperation(operation);
startability(intent);
参数说明:
- deviceid:表示设备id。如果是本地设备,则可以直接留空;如果是远程设备,可以通过ohos.distributedschedule.interwork.devicemanager提供的getdevicelist获取设备列表。
- bundlename:表示包名称。
- abilityname:表示待启动的ability名称。 启动远程服务如下:
operation operation = new intent.operationbuilder()
.withdeviceid(“deviceid”)
.withbundlename(“com.huawei.hiworld.himusic”)
.withabilityname(“com.huawei.hiworld.himusic.entry.serviceability”)
.withflags(intent.flag_abilityslice_multi_device) // 设置支持分布式调度系统多设备启动的标识
.build();
intent intent = new intent();
intent.setoperation(operation);
startability(intent);
ability将通过startability() 方法来启动service。 如果service尚未运行,则系统会先调用onstart()来初始化service,再回调service的oncommand()方法来启动service。 如果service正在运行,则系统会直接回调service的oncommand()方法来启动service。
android
开发者可以通过将 intent 传递给 startservice() 或 startforegroundservice(),从 activity 或其他应用组件启动服务。android 系统会调用服务的 onstartcommand() 方法,并向其传递 intent,从而指定要启动的服务。如果应用面向 api 级别 26 或更高版本,除非应用本身在前台运行,否则系统不会对使用或创建后台服务施加限制。如果应用需要创建前台服务,则其应调用 startforegroundservice()。此方法会创建后台服务,但它会向系统发出信号,表明服务会将自行提升至前台。创建服务后,该服务必须在五秒内调用自己的 startforeground() 方法。
intent intent = new intent(this, androidservice.class);
startservice(intent);
startservice() 方法会立即返回,并且 android 系统会调用服务的 onstartcommand() 方法。如果服务尚未运行,则系统首先会调用 oncreate(),然后调用 onstartcommand()。 如果服务亦未提供绑定,则应用组件与服务间的唯一通信模式便是使用 startservice() 传递的 intent。但是,如果开发者希望服务返回结果,则启动服务的客户端可以为广播(通过 getbroadcast() 获得)创建一个 pendingintent,并将其传递给启动服务的 intent 中的服务。然后,服务便可使用广播传递结果。 多个服务启动请求会导致多次对服务的 onstartcommand() 进行相应的调用。但是,如要停止服务,只需一个服务停止请求(使用 stopself() 或 stopservice())即可。
启动前台服务(可选)
harmonyos
开发者只需在service创建的方法里,调用keepbackgroundrunning()将service与通知绑定。调用keepbackgroundrunning()方法前需要在配置文件中声明。ohos.permission.keep_background_running权限,该权限是normal级别,同时还需要在配置文件中添加对应的backgroundmodes参数。在onstop()方法中调用cancelbackgroundrunning()方法可停止前台service。使用前台service的onstart()代码示例如下:
// 创建通知,其中1005为notificationid
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);
// 绑定通知,1005为创建通知时传入的notificationid
keepbackgroundrunning(1005, request);
在配置文件中配置如下:
{
“name”: “.serviceability”,
“type”: “service”,
“visible”: true,
“backgroundmodes”: [“datatransfer”,“location”]
}
android
开发者创建前台服务,需要调用startforeground(),这个方法同样需要notificationid和notification实例:
intent notificationintent = new intent(this, androidactivity.class);
pendingintent pendingintent =
pendingintent.getactivity(this, 0, notificationintent, 0);
notification notification =
new notification.builder(this, channel_default_importance)
.setcontenttitle(gettext(r.string.notification_title))
.setcontenttext(gettext(r.string.notification_message))
.setsmallicon(r.drawable.icon)
.setcontentintent(pendingintent)
.setticker(gettext(r.string.ticker_text))
.build();
startforeground(ongoing_notification_id, notification);
注意:notification id不能为0,同时在android 9 (api level 28) 获取更高版本中前台服务需要申明:foreground_service权限:
<manifest xmlns:android=“http://schemas.android.com/apk/res/android” …>
<application …>
…
如果应用目标level高于android 10 (api level 29) 在清单文件中还要申明相关前台服务类型:
...代码中也要申明:
notification notification = …;
service.startforeground(notification,
foreground_service_type_location | foreground_service_type_camera);
绑定服务(可选)
harmonyos
如果service需要与page ability或其他应用的service ability进行交互,则应创建用于连接的connection。service支持其他ability通过connectability()方法与其进行连接。 在使用connectability()处理回调时,需要传入目标service的intent与iabilityconnection的实例。iabilityconnection提供了两个方法供开发者实现:onabilityconnectdone()用来处理连接的回调,onabilitydisconnectdone()用来处理断开连接的回调。
// 创建连接回调实例
private iabilityconnection connection = new iabilityconnection() {
// 连接到service的回调
@override
public void onabilityconnectdone(elementname elementname, iremoteobject iremoteobject, int resultcode) {
// 在这里开发者可以拿到服务端传过来iremoteobject对象,从中解析出服务端传过来的信息
}
// 断开与连接的回调
@override
public void onabilitydisconnectdone(elementname elementname, int resultcode) {
}
};
// 连接service
connectability(intent, connection);
同时,service侧也需要在onconnect()时返回iremoteobject,从而定义与service进行通信的接口。onconnect()需要返回一个iremoteobject对象,harmonyos提供了iremoteobject的默认实现,用户可以通过继承remoteobject来创建自定义的实现类。service侧把自身的实例返回给调用侧的代码示例如下:
// 创建自定义iremoteobject实现类
private class myremoteobject extends remoteobject {
public myremoteobject() {
super(“myremoteobject”);
}
}
// 把iremoteobject返回给客户端
@override
protected iremoteobject onconnect(intent intent) {
return new myremoteobject();
}
android
绑定服务是客户端-服务器接口中的服务器。借助绑定服务,组件(例如 activity)可以绑定到服务、发送请求、接收响应,以及执行进程间通信 (ipc)。绑定服务通常只在为其他应用组件提供服务时处于活动状态,不会无限期在后台运行。创建提供绑定的服务时,您必须提供 ibinder,进而提供编程接口,以便客户端使用此接口与服务进行交互。开发者可以通过三种方法定义接口:扩展 binder 类,使用 messenger,使用 aidl(一般不用)。
- 扩展 binder 类。创建代码如下:
public class localservice extends service {
private final ibinder binder = new localbinder();
private final random mgenerator = new random();
public class localbinder extends binder {
localservice getservice() {
return localservice.this;
}
}
@override
public ibinder onbind(intent intent) {
return binder;
}
public int getrandomnumber() {
return mgenerator.nextint(100);
}
}
启动如下:
public class bindingactivity extends activity {
localservice mservice;
boolean mbound = false;
@override
protected void onstart() {
super.onstart();
intent intent = new intent(this, localservice.class);
bindservice(intent, connection, context.bind_auto_create);
}
@override
protected void onstop() {
super.onstop();
unbindservice(connection);
mbound = false;
}
public void onbuttonclick(view v) {
if (mbound) {
int num = mservice.getrandomnumber();
…
}
}
private serviceconnection connection = new serviceconnection() {
@override
public void onserviceconnected(componentname classname,
ibinder service) {
localbinder binder = (localbinder) service;
mservice = binder.getservice();
mbound = true;
}
@override
public void onservicedisconnected(componentname arg0) {
mbound = false;
}
};
}
- 使用 messenger。创建代码如下:
public class messengerservice extends service {
static final int msg_say_hello = 1;
static class incominghandler extends handler {
private context applicationcontext;
incominghandler(context context) {
applicationcontext = context.getapplicationcontext();
}
@override
public void handlemessage(message msg) {
switch (msg.what) {
case msg_say_hello:
…
break;
default:
super.handlemessage(msg);
}
}
}
messenger mmessenger;
@override
public ibinder onbind(intent intent) {
…
mmessenger = new messenger(new incominghandler(this));
return mmessenger.getbinder();
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、oppo等大厂,18年进入阿里一直到现在。
深知大多数初中级android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:android)

尾声
最后,我再重复一次,如果你想成为一个优秀的 android 开发人员,请集中精力,对基础和重要的事情做深度研究。
对于很多初中级android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
android进阶学习资料库
一共十个专题,包括了android进阶所有学习资料,android进阶视频,flutter,java基础,kotlin,ndk模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》
收获与成长,其余的都不重要,希望读者们能谨记这一点。
这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家梳理了多年的架构经验,筹备近6个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
[外链图片转存中…(img-so9mmdtb-1713375142152)]
android进阶学习资料库
一共十个专题,包括了android进阶所有学习资料,android进阶视频,flutter,java基础,kotlin,ndk模块,计算机网络,数据结构与算法,微信小程序,面试题解析,framework源码!
[外链图片转存中…(img-rqouyj9i-1713375142154)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》
发表评论