Linux系统编程-(pthread)线程创建与使用
893
2022-05-29
startService第一次启动会调用onCreate,onCreate只会在创建的时候调用一次,之后多次启动会多次调用onStartCommand。stopService会停止Service,多次调用stopService不会报错。
bindService第一次启动会依次调用onCreate->onBind->onServiceConnected。多次调用bindService, onBind和onServiceConnected都不会多次回调。多次调用unBindService会报错。
START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
服务在其托管进程的主线程中运行的
开启服务的组件退出之后,服务还是可以在后台长期运行的。其他组件可以调用stopService(Intent)或者自身调用stopSelf停止
组件不能调用服务里面的方法
组件销毁后服务自动被销毁,如果一个Service被多个组件绑定,只有所有的组件被销毁这个服务才会销毁
组件可以调用服务里面的方法
同时调用stopService和unbindService才可以回调onDestory
都运行在主线程
使用Intent,onStartCommand时候传入的Intent
BroadcastReceiver,Service发送,Activity接收
接口回调
共享硬盘存储,共享内存
ServiceConnection
获取系统Service一般用getSystemService方法。常见的Service有
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
ActivityManagerService
PackageManagerService
WindowManagerService
不能。因为服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。它不可以做密集耗时的操作。如果非要做的话,可以启动一个新的线程来工作。
前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。 前台服务必须为状态栏提供通知,放在“正在进行”标题下方,这意味着除非服务停止或从前台移除,否则不能清除通知。
要请求让服务运行于前台,请调用 startForeground()。此方法采用两个参数:唯一标识通知的整型数和状态栏的 Notification。
相互唤起,需要借助其他APP
service 相互使用广播唤起 (鸡肋)
和手机商合作 (最高效)
设置 service 等级,priority (鸡肋)
onStartCommand方法,返回 START_STICKY,内存充足的时候会重启 (鸡肋)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。