标签:class reg read 其他应用 load sdk .class 行操作 ons
Android Service是一个可以在后台执行长时间运行操作而不提供用户界面的应用组件,它分为两种工作状态,一种是启动状态,主要用于执行后台计算;另一种是绑定状态,主要用于其他组件和Service的交互。需要注意的两点:
防止ANR风险,主线程运行的Service在执行耗时操作,则应在服务内创建新线程来完成这项工作,这可以降低发生“应用无响应”(ANR) 错误的风险。
public class MyService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
Service需要重写重要的回调方法有以下几个
像Activity(以及其他组件)一样,您必须在应用AndroidManifest.xml清单文件中声明所有服务
<service android:name=".MyService"/>
通过Context启动一个Service,这会导致对?onStartCommand()?的调用,则服务将一直运行,直到服务使用?stopSelf()?自行停止运行,或由其他组件通过调用?stopService()?停止,如下所示
startService(new Intent(this, MyService.class));
但在Android8.0的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。 新的 Context.startForegroundService() 函数将启动一个前台服务。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
??? startForegroundService(intent);
} else {
??? startService(intent);
}
并且在在service里再调用startForeground方法,不然就会出现ANR
context.startForeground(SERVICE_ID, builder.getNotification());
通过Context绑定一个Service,且未调用?onStartCommand(),则服务只会在该组件与其绑定时运行,一旦该服务与所有客户端之间的绑定全部取消,系统便会销毁它,如下所示
bindService(new Intent(this, MyService.class), connection, BIND_AUTO_CREATE);
注意:系统内存不足时,Android会强制停止优先级低的Service来提供内存给Activity使用,但持有Activity的Service可能不会终止,或者前台运行的Service几乎永远不会终止。
首先我们先看下Service的类的调用流程
相关类说明
Service最终创建需要需要通过Handler进行消息发送来实现创建,并把创建好的servic存储在ArrayMap中。接下来看下Service的生命周期是怎样的。
需要注意的是,在整个生命周期内,只有startCommand()能被多次调用。其他方法只能被调用一次。
Service绑定跟Service的启动了类调用流程基本一致,只是相关方法改为bind,但其最后会调用ServiceConnection对象的onServiceConnected方法。接下来看下Service的生命周期是怎样的
但其有一个特性,多次绑定同一个Service时,Service的onBind方法只会执行一次,除非Service被终止了。
标签:class reg read 其他应用 load sdk .class 行操作 ons
原文地址:https://www.cnblogs.com/fomin/p/10490808.html