Android Service知识梳理

举报
月色很美 发表于 2018/12/19 08:17:36 2018/12/19
【摘要】 startServicestartService第一次启动会调用onCreate,onCreate只会在创建的时候调用一次,之后多次启动会多次调用onStartCommand。stopService会停止Service,多次调用stopService不会报错。bindServicebindService第一次启动会依次调用onCreate->onBind->onServiceConnecte...

startService

startService第一次启动会调用onCreate,onCreate只会在创建的时候调用一次,之后多次启动会多次调用onStartCommandstopService会停止Service,多次调用stopService不会报错。

bindService

bindService第一次启动会依次调用onCreate->onBind->onServiceConnected。多次调用bindService, onBindonServiceConnected都不会多次回调。多次调用unBindService会报错。

startCommand

  • 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后一定能重启。

服务在其托管进程的主线程中运行的

Q:谈一谈Service的生命周期?

Q:Service的两种启动方式?区别在哪?

启动
  • 开启服务的组件退出之后,服务还是可以在后台长期运行的。其他组件可以调用stopService(Intent)或者自身调用stopSelf停止

  • 组件不能调用服务里面的方法

绑定
  • 组件销毁后服务自动被销毁,如果一个Service被多个组件绑定,只有所有的组件被销毁这个服务才会销毁

  • 组件可以调用服务里面的方法

Q:一个Activty先start一个Service后,再bind时会回调什么方法?此时如何做才能回调Service的destory()方法?

同时调用stopServiceunbindService才可以回调onDestory

Q:Service 的生命周期方法 onCreate、onStart、onBind 等运行在哪个线程?

都运行在主线程

Q:Service如何和Activity进行通信?

  • 使用IntentonStartCommand时候传入的Intent

  • BroadcastReceiver,Service发送,Activity接收

  • 接口回调

  • 共享硬盘存储,共享内存

  • ServiceConnection

Q:用过哪些系统Service?

获取系统Service一般用getSystemService方法。常见的Service有

  • LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);

  • ActivityManagerService

  • PackageManagerService

  • WindowManagerService

Q:是否能在Service进行耗时操作?如果非要可以怎么做?

不能。因为服务在其托管进程的主线程中运行,它既创建自己的线程,也在单独的进程中运行(除非另行指定)。它不可以做密集耗时的操作。如果非要做的话,可以启动一个新的线程来工作。

Q:前台服务是什么?和普通服务的不同?如何去开启一个前台服务?

  • 前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。 前台服务必须为状态栏提供通知,放在“正在进行”标题下方,这意味着除非服务停止或从前台移除,否则不能清除通知。

  • 要请求让服务运行于前台,请调用 startForeground()。此方法采用两个参数:唯一标识通知的整型数和状态栏的 Notification。

Q:如何保证Service不被杀死?

  • 相互唤起,需要借助其他APP

  • service 相互使用广播唤起 (鸡肋)

  • 和手机商合作 (最高效)

  • 设置 service 等级,priority (鸡肋)

  • onStartCommand方法,返回 START_STICKY,内存充足的时候会重启 (鸡肋)


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。