笔记:Android 四大组件

2017-10-23  本文已影响12人  jiaming_

Android 四大组件


注册方式上

Activity Service ContentProvider 必须在AndroidManifest中注册,BroadcastReceiver可以在清单文件注册,也可以在代码中注册

调用方式上

Activity Service BroadcastReceiver必须借助Intent启动,ContentProvider不需要


Service


同一个包中,显示启动和隐式启动都可以用,不同包只能用隐式启动

隐士启动通过设置Action的方式启动

***** 需要注意的是在5.0上采用隐式启动时,会出现java.lang.IllegalArgumentException: Service Intent must be explicit异常。也就是说Service的Intent必须明确。

解决方法就是给Intent设置一下具体的包名,指明具体是哪个包启动的Service。
intent.setPackage("com.android.vending")

或者通过给Intent设置ComponentName的方式启动

或者通过隐式Intent反查找Component转化成显示Intent启动。

参考1

参考2






一张简单泳道图 从startActivity()开始


Context appContext = createBaseContextForActivity(r, activity);



  1. START_STICKY

服务被异常杀死后,会被重新调起,但传入onStartCommand的Intent为null,适用于不执行命令的媒体播放器,无限期运行等待着工作的到来

  1. START_NOT_STICKY

服务被杀死后就退出了启动状态,除非重新调用startService启动服务,不然服务不会运行。

  1. START_REDELIVER_INTENT

服务被异常Kill后,系统会重启服务,并且保留kill之前的Intent,并且在该服务调用stopSelf之前,一直保留Intent,适用于应该立即恢复正在执行的工作的服务,如文件下载

  1. START_STICKY_COMPATIBILITY

START_STICKY的兼容版本,但不保证服务被终止后一定能重启。



除了广播外,其他三大组件也是由PMS在安装时完成注册



只在app内传播的广播,为单例模式。


ActivityThread会先加载ContentProvider,然后执行Application的onCreate()

ActivityThread.handleBindApplication->LoadApk.makeApplication()->ActivityThread.installContentProviders()->mInstrumentation.callApplicationOnCreate->Applicaiton.onCreate()






上一篇 下一篇

猜你喜欢

热点阅读