ToB企服应用市场:ToB评测及商务社交产业平台

标题: HarmonyOS-Service&Android-Service(2) [打印本页]

作者: 道家人    时间: 2024-11-23 03:38
标题: HarmonyOS-Service&Android-Service(2)
public abstract class Context {
/** @hide */
@IntDef(flag = true, prefix = { “MODE_” }, value = {
MODE_PRIVATE,

})

}
也就是说HarmonyOS中服务和界面其实是一体,而Android中服务与界面是分开的。 纵观HarmonyOS现在开放的应用开发代码,使用接口的地方显着要比Android多,如许代码会很轻量、方便、灵活。从上图中可以看出,相比Android,HarmonyOS Ability只有一个父类AbilityContext(Context是接口),层级只有一层,虽够简洁,但是其所支持的Api现在比力有限,甚至有些单一,不利于开发者开发。而Android是层级较多,代码实行效率相对比力慢,虽看起来代码嵌套太多,甚至有些冗余,但提供Api丰富,方便开发者开发。 HarmonyOS中Context不管是何种Context,可以通用。Android中Context分为Activity,Service和Application,以是有些时间使用context或this的会报错,主要是context类型不一致导致的。
生命周期

不管是HarmonyOS还Android,两者Service的生命周期根本相同,具体如下:

根据调用方法的差别,两种Service生命周期都可以细分为普通服务和连接服务(HarmonyOS中称为连接服务,Android中则为绑定服务)。

根据使用场景差别,HarmonyOS Service和Android Service都分为背景服务,前台服务,绑定(连接)服务。

不管是哪一种服务,服务既可以单独存在,也可以共存,即可以同时有前台服务和绑定服务,或者其他组合方式存在。 两种Service不仅生命周期根本一致,具体的周期状态也根本一致,如下表所示:
HarmonyOSAndroidonStart()onCreate()onCommand()onStartCommand()onConnect()onBind()onDisconnect()onUnbind()onStop()onDestroy() 其中HarmonyOS:
public class HarmonyOSService extends Ability {
@Override
public void onStart(Intent intent) {
super.onStart(intent);
}
@Override
public void onCommand(Intent intent, boolean restart, int startId) {
super.onCommand(intent, restart, startId);
}
@Override
public IRemoteObject onConnect(Intent intent) {
super.onConnect(intent);
return null;
}
@Override
public void onDisconnect(Intent intent) {
super.onDisconnect(intent);
}
@Override
public void onStop() {
super.onStop();
}
}
Android:
public class AndroidService extends Service {
@Override
public void onCreate() {
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();
}
}
初始化:

启动:

绑定:

解绑:

销毁:

使用

创建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);
参数说明:

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(一般不用)。

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);
}
}
自我介绍一下,小编13年上海交大结业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索发展或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学结果低效又漫长,而且极易碰到天花板技能停滞不前!
因此网络整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻各人的负担。





既有适合小白学习的零底子资料,也有适合3年以上履历的小伙伴深入学习提升的进阶课程,根本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比力大,这里只是将部门目录截图出来,每个节点内里都包罗大厂面经、学习条记、源码课本、实战项目、讲解视频,并且会持续更新!
如果你以为这些内容对你有帮助,可以扫码获取!!(备注:Android)
末了

愿你有一天,真爱自己,善待自己。
《互联网大厂面试真题解析、进阶开发焦点学习条记、全套讲解视频、实战项目源码课本》点击传送门即可获取!
dT-1713375106256)]
既有适合小白学习的零底子资料,也有适合3年以上履历的小伙伴深入学习提升的进阶课程,根本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比力大,这里只是将部门目录截图出来,每个节点内里都包罗大厂面经、学习条记、源码课本、实战项目、讲解视频,并且会持续更新!
如果你以为这些内容对你有帮助,可以扫码获取!!(备注:Android)
末了

愿你有一天,真爱自己,善待自己。
《互联网大厂面试真题解析、进阶开发焦点学习条记、全套讲解视频、实战项目源码课本》点击传送门即可获取!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4