四大组件原理在探


四大组件是什么
Android四大组件有Activity,Service服务,Content Provider内容提供,BroadcastReceiver。

四大组件的生命周期和简单用法
activity:onCreate() -> onStart() -> onResume() -> onPause() -> 
onStop() -> onDetroy()
Service:
service 启动方式有两种,一种是通过startService()方式进行启动,

另一种是通过bindService()方式进行启动。不同的启动方式他们的生命周期是不一样.

通过startService()这种方式启动的service,生命周期是这样:

调用startService() --> onCreate()--> onStartConmon()--> onDestroy()。

这种方式启动的话,需要注意一下几个问题,第一:当我们通过startService被调用以后,多次在调用startService(),
onCreate()方法也只会被调用一次,而onStartConmon()会被多次调用当我们调用stopService()的时候,
onDestroy()就会被调用,从而销毁服务。

启动

2020-07-06 14:29:30.874 19891-19891/com.massky.sraum E/lazy: onCreate: acom.massky.sraum.activity.LaunghActivity@b17131c
2020-07-06 14:29:30.877 19891-19891/com.massky.sraum E/lazy: onStart: acom.massky.sraum.activity.LaunghActivity@b17131c
2020-07-06 14:29:30.886 19891-19891/com.massky.sraum E/lazy: onResume: acom.massky.sraum.activity.LaunghActivity@b17131c
2020-07-06 14:29:33.898 19891-19891/com.massky.sraum E/lazy: onPause: acom.massky.sraum.activity.LaunghActivity@b17131c
2020-07-06 14:29:33.951 19891-19891/com.massky.sraum E/lazy: onAttach: fHomeFragmentNew{9e9fae3 (7bedc76a-23d3-45b5-adc6-98e07d4de6bc) id=0x7f09012e}
2020-07-06 14:29:33.951 19891-19891/com.massky.sraum E/lazy: onCreate: fHomeFragmentNew{9e9fae3 (7bedc76a-23d3-45b5-adc6-98e07d4de6bc) id=0x7f09012e}
2020-07-06 14:29:33.951 19891-19891/com.massky.sraum E/lazy: onAttach: fSceneFragment{2be370c (54b5b14b-a02e-4bd0-bb0d-c2f7e9d3f7ac) id=0x7f09012e}
2020-07-06 14:29:33.952 19891-19891/com.massky.sraum E/lazy: onCreate: fSceneFragment{2be370c (54b5b14b-a02e-4bd0-bb0d-c2f7e9d3f7ac) id=0x7f09012e}
2020-07-06 14:29:33.952 19891-19891/com.massky.sraum E/lazy: onAttach: fMineFragment{70514d1 (6a523fdd-d977-455d-a766-ea3891e04ab1) id=0x7f09012e}
2020-07-06 14:29:33.952 19891-19891/com.massky.sraum E/lazy: onCreate: fMineFragment{70514d1 (6a523fdd-d977-455d-a766-ea3891e04ab1) id=0x7f09012e}
2020-07-06 14:29:34.039 19891-19891/com.massky.sraum E/lazy: onCreate: acom.massky.sraum.activity.MainGateWayActivity@ee8bf03
2020-07-06 14:29:34.151 19891-19891/com.massky.sraum E/lazy: onCreateView: fHomeFragmentNew{9e9fae3 (7bedc76a-23d3-45b5-adc6-98e07d4de6bc) id=0x7f09012e}
2020-07-06 14:29:34.151 19891-19891/com.massky.sraum E/lazy: onViewCreated: fHomeFragmentNew{9e9fae3 (7bedc76a-23d3-45b5-adc6-98e07d4de6bc) id=0x7f09012e}
2020-07-06 14:29:34.151 19891-19891/com.massky.sraum E/lazy: onActivityCreated: fHomeFragmentNew{9e9fae3 (7bedc76a-23d3-45b5-adc6-98e07d4de6bc) id=0x7f09012e}
2020-07-06 14:29:34.193 19891-19891/com.massky.sraum E/lazy: onCreateView: fSceneFragment{2be370c (54b5b14b-a02e-4bd0-bb0d-c2f7e9d3f7ac) id=0x7f09012e}
2020-07-06 14:29:34.194 19891-19891/com.massky.sraum E/lazy: onViewCreated: fSceneFragment{2be370c (54b5b14b-a02e-4bd0-bb0d-c2f7e9d3f7ac) id=0x7f09012e}
2020-07-06 14:29:34.194 19891-19891/com.massky.sraum E/lazy: onActivityCreated: fSceneFragment{2be370c (54b5b14b-a02e-4bd0-bb0d-c2f7e9d3f7ac) id=0x7f09012e}
2020-07-06 14:29:34.275 19891-19891/com.massky.sraum E/lazy: onCreateView: fMineFragment{70514d1 (6a523fdd-d977-455d-a766-ea3891e04ab1) id=0x7f09012e}
2020-07-06 14:29:34.275 19891-19891/com.massky.sraum E/lazy: onViewCreated: fMineFragment{70514d1 (6a523fdd-d977-455d-a766-ea3891e04ab1) id=0x7f09012e}
2020-07-06 14:29:34.275 19891-19891/com.massky.sraum E/lazy: onActivityCreated: fMineFragment{70514d1 (6a523fdd-d977-455d-a766-ea3891e04ab1) id=0x7f09012e}
2020-07-06 14:29:34.276 19891-19891/com.massky.sraum E/lazy: onStart: fHomeFragmentNew{9e9fae3 (7bedc76a-23d3-45b5-adc6-98e07d4de6bc) id=0x7f09012e}
2020-07-06 14:29:34.276 19891-19891/com.massky.sraum E/lazy: onStart: fSceneFragment{2be370c (54b5b14b-a02e-4bd0-bb0d-c2f7e9d3f7ac) id=0x7f09012e}
2020-07-06 14:29:34.276 19891-19891/com.massky.sraum E/lazy: onStart: fMineFragment{70514d1 (6a523fdd-d977-455d-a766-ea3891e04ab1) id=0x7f09012e}
2020-07-06 14:29:34.277 19891-19891/com.massky.sraum E/lazy: onStart: acom.massky.sraum.activity.MainGateWayActivity@ee8bf03
2020-07-06 14:29:34.289 19891-19891/com.massky.sraum E/lazy: onResume: acom.massky.sraum.activity.MainGateWayActivity@ee8bf03
2020-07-06 14:29:34.290 19891-19891/com.massky.sraum E/lazy: onResume: fHomeFragmentNew{9e9fae3 (7bedc76a-23d3-45b5-adc6-98e07d4de6bc) id=0x7f09012e}
2020-07-06 14:29:34.329 19891-19891/com.massky.sraum E/lazy: onResume: fSceneFragment{2be370c (54b5b14b-a02e-4bd0-bb0d-c2f7e9d3f7ac) id=0x7f09012e}
2020-07-06 14:29:34.330 19891-19891/com.massky.sraum E/lazy: onResume: fMineFragment{70514d1 (6a523fdd-d977-455d-a766-ea3891e04ab1) id=0x7f09012e}
2020-07-06 14:29:36.881 19891-19891/com.massky.sraum E/lazy: onStop: acom.massky.sraum.activity.LaunghActivity@b17131c
2020-07-06 14:29:36.882 19891-19891/com.massky.sraum E/lazy: onDestroy: acom.massky.sraum.activity.LaunghActivity@b17131c

切到后台时 
2020-07-06 15:25:57.929 23988-23988/com.massky.sraum E/lazy: onPause: fHomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}
2020-07-06 15:25:57.930 23988-23988/com.massky.sraum E/lazy: onPause: fSceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}
2020-07-06 15:25:57.930 23988-23988/com.massky.sraum E/lazy: onPause: fMineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}
2020-07-06 15:25:57.931 23988-23988/com.massky.sraum E/lazy: onPause: fHandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}
2020-07-06 15:25:57.932 23988-23988/com.massky.sraum E/lazy: onPause: fAutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}
2020-07-06 15:25:57.932 23988-23988/com.massky.sraum E/lazy: onPause: acom.massky.sraum.activity.MainGateWayActivity@7eeeb27
2020-07-06 15:25:58.402 23988-23988/com.massky.sraum E/lazy: onStop: fHomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}HomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}
2020-07-06 15:25:58.403 23988-23988/com.massky.sraum E/lazy: onStop: fSceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}SceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}
2020-07-06 15:25:58.405 23988-23988/com.massky.sraum E/lazy: onStop: fMineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}MineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}
2020-07-06 15:25:58.405 23988-23988/com.massky.sraum E/lazy: onStop: fHandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}HandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}
2020-07-06 15:25:58.406 23988-23988/com.massky.sraum E/lazy: onStop: fAutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}AutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}
2020-07-06 15:25:58.406 23988-23988/com.massky.sraum E/lazy: onStop: acom.massky.sraum.activity.MainGateWayActivity@7eeeb27


由后台切回到前台

2020-07-06 15:28:23.926 23988-23988/com.massky.sraum E/lazy: onStart: fHomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}
2020-07-06 15:28:23.927 23988-23988/com.massky.sraum E/lazy: onStart: fSceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}
2020-07-06 15:28:23.927 23988-23988/com.massky.sraum E/lazy: onStart: fMineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}
2020-07-06 15:28:23.928 23988-23988/com.massky.sraum E/lazy: onStart: fHandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}
2020-07-06 15:28:23.928 23988-23988/com.massky.sraum E/lazy: onStart: fAutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}
2020-07-06 15:28:23.929 23988-23988/com.massky.sraum E/lazy: onStart: acom.massky.sraum.activity.MainGateWayActivity@7eeeb27
2020-07-06 15:28:23.940 23988-23988/com.massky.sraum E/lazy: onResume: acom.massky.sraum.activity.MainGateWayActivity@7eeeb27
2020-07-06 15:28:23.940 23988-23988/com.massky.sraum E/lazy: onResume: fHomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}
2020-07-06 15:28:23.964 23988-23988/com.massky.sraum E/lazy: onResume: fSceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}
2020-07-06 15:28:23.965 23988-23988/com.massky.sraum E/lazy: onResume: fMineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}
2020-07-06 15:28:24.001 23988-23988/com.massky.sraum E/lazy: onResume: fHandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}
2020-07-06 15:28:24.005 23988-23988/com.massky.sraum E/lazy: onResume: fAutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}


退出app
2020-07-06 15:29:07.622 23988-23988/com.massky.sraum E/lazy: onPause: fHomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}
2020-07-06 15:29:07.623 23988-23988/com.massky.sraum E/lazy: onPause: fSceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}
2020-07-06 15:29:07.624 23988-23988/com.massky.sraum E/lazy: onPause: fMineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}
2020-07-06 15:29:07.625 23988-23988/com.massky.sraum E/lazy: onPause: fHandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}
2020-07-06 15:29:07.626 23988-23988/com.massky.sraum E/lazy: onPause: fAutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}
2020-07-06 15:29:07.626 23988-23988/com.massky.sraum E/lazy: onPause: acom.massky.sraum.activity.MainGateWayActivity@7eeeb27
2020-07-06 15:29:08.096 23988-23988/com.massky.sraum E/lazy: onStop: fHomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}HomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}
2020-07-06 15:29:08.096 23988-23988/com.massky.sraum E/lazy: onStop: fSceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}SceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}
2020-07-06 15:29:08.096 23988-23988/com.massky.sraum E/lazy: onStop: fMineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}MineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}
2020-07-06 15:29:08.096 23988-23988/com.massky.sraum E/lazy: onStop: fHandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}HandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}
2020-07-06 15:29:08.097 23988-23988/com.massky.sraum E/lazy: onStop: fAutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}AutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}
2020-07-06 15:29:08.097 23988-23988/com.massky.sraum E/lazy: onStop: acom.massky.sraum.activity.MainGateWayActivity@7eeeb27
2020-07-06 15:29:08.105 23988-23988/com.massky.sraum E/lazy: onDestroyView: fHomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}
2020-07-06 15:29:08.119 23988-23988/com.massky.sraum E/lazy: onDestroy: fHomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}
2020-07-06 15:29:08.119 23988-23988/com.massky.sraum E/lazy: onDetach: fHomeFragmentNew{cbd318 (33eb32ea-9d1b-4f3b-a408-a1dc492d87ca) id=0x7f09012e}
2020-07-06 15:29:08.120 23988-23988/com.massky.sraum E/lazy: onDestroyView: fSceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}
2020-07-06 15:29:08.130 23988-23988/com.massky.sraum E/lazy: onDestroy: fSceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}
2020-07-06 15:29:08.130 23988-23988/com.massky.sraum E/lazy: onDetach: fSceneFragment{bb2a3ad (5d284d04-eace-47cb-bad9-597e0c7f5653) id=0x7f09012e}
2020-07-06 15:29:08.131 23988-23988/com.massky.sraum E/lazy: onDestroyView: fMineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}
2020-07-06 15:29:08.132 23988-23988/com.massky.sraum E/lazy: onDestroy: fMineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}
2020-07-06 15:29:08.133 23988-23988/com.massky.sraum E/lazy: onDetach: fMineFragment{4113f2e (64f81eca-9d5f-40a7-b323-b97b028e41bb) id=0x7f09012e}
2020-07-06 15:29:08.136 23988-23988/com.massky.sraum E/lazy: onDestroyView: fHandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}
2020-07-06 15:29:08.137 23988-23988/com.massky.sraum E/lazy: onDestroy: fHandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}
2020-07-06 15:29:08.138 23988-23988/com.massky.sraum E/lazy: onDetach: fHandSceneFragment{ac51957 (5f737b1d-3ed4-445e-aa6f-fccbd7ca156f) HandSceneFragment}
2020-07-06 15:29:08.138 23988-23988/com.massky.sraum E/lazy: onDestroyView: fAutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}
2020-07-06 15:29:08.140 23988-23988/com.massky.sraum E/lazy: onDestroy: fAutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}
2020-07-06 15:29:08.140 23988-23988/com.massky.sraum E/lazy: onDetach: fAutoSceneFragment{376875e (40d97fe8-5e10-407f-8b7c-ff40cf532010) AutoSceneFragment}
2020-07-06 15:29:08.141 23988-23988/com.massky.sraum E/lazy: onDestroy: acom.massky.sraum.activity.MainGateWayActivity@7eeeb27


MainGateWayActivity跳到第二个SelectZigbeeDeviceActivityNew

2020-07-06 15:30:58.353 25341-25341/com.massky.sraum E/lazy: onPause: fHomeFragmentNew{9e9fae3 (0cdc4b8b-167d-420f-9b54-f39bd992f1cc) id=0x7f09012e}
2020-07-06 15:30:58.353 25341-25341/com.massky.sraum E/lazy: onPause: fSceneFragment{2be370c (164843f2-acab-4314-b790-dc0cb4b347bc) id=0x7f09012e}
2020-07-06 15:30:58.354 25341-25341/com.massky.sraum E/lazy: onPause: fMineFragment{70514d1 (37b7a924-8085-4d9c-abcf-21b8f0e551ef) id=0x7f09012e}
2020-07-06 15:30:58.354 25341-25341/com.massky.sraum E/lazy: onPause: acom.massky.sraum.activity.MainGateWayActivity@ee8bf03
2020-07-06 15:30:58.406 25341-25341/com.massky.sraum E/lazy: onCreate: acom.massky.sraum.activity.SelectZigbeeDeviceActivityNew@626ebda
2020-07-06 15:30:58.408 25341-25341/com.massky.sraum E/lazy: onStart: acom.massky.sraum.activity.SelectZigbeeDeviceActivityNew@626ebda
2020-07-06 15:30:58.413 25341-25341/com.massky.sraum E/lazy: onResume: acom.massky.sraum.activity.SelectZigbeeDeviceActivityNew@626ebda
2020-07-06 15:30:59.037 25341-25341/com.massky.sraum E/lazy: onStop: fHomeFragmentNew{9e9fae3 (0cdc4b8b-167d-420f-9b54-f39bd992f1cc) id=0x7f09012e}HomeFragmentNew{9e9fae3 (0cdc4b8b-167d-420f-9b54-f39bd992f1cc) id=0x7f09012e}
2020-07-06 15:30:59.038 25341-25341/com.massky.sraum E/lazy: onStop: fSceneFragment{2be370c (164843f2-acab-4314-b790-dc0cb4b347bc) id=0x7f09012e}SceneFragment{2be370c (164843f2-acab-4314-b790-dc0cb4b347bc) id=0x7f09012e}
2020-07-06 15:30:59.038 25341-25341/com.massky.sraum E/lazy: onStop: fMineFragment{70514d1 (37b7a924-8085-4d9c-abcf-21b8f0e551ef) id=0x7f09012e}MineFragment{70514d1 (37b7a924-8085-4d9c-abcf-21b8f0e551ef) id=0x7f09012e}
2020-07-06 15:30:59.039 25341-25341/com.massky.sraum E/lazy: onStop: acom.massky.sraum.activity.MainGateWayActivity@ee8bf03

跳转回来
2020-07-06 15:32:16.265 25341-25341/com.massky.sraum E/lazy: onPause: acom.massky.sraum.activity.SelectZigbeeDeviceActivityNew@626ebda
2020-07-06 15:32:16.289 25341-25341/com.massky.sraum E/lazy: onStart: fHomeFragmentNew{9e9fae3 (0cdc4b8b-167d-420f-9b54-f39bd992f1cc) id=0x7f09012e}
2020-07-06 15:32:16.289 25341-25341/com.massky.sraum E/lazy: onStart: fSceneFragment{2be370c (164843f2-acab-4314-b790-dc0cb4b347bc) id=0x7f09012e}
2020-07-06 15:32:16.290 25341-25341/com.massky.sraum E/lazy: onStart: fMineFragment{70514d1 (37b7a924-8085-4d9c-abcf-21b8f0e551ef) id=0x7f09012e}
2020-07-06 15:32:16.291 25341-25341/com.massky.sraum E/lazy: onStart: acom.massky.sraum.activity.MainGateWayActivity@ee8bf03
2020-07-06 15:32:16.300 25341-25341/com.massky.sraum E/lazy: onResume: acom.massky.sraum.activity.MainGateWayActivity@ee8bf03
2020-07-06 15:32:16.301 25341-25341/com.massky.sraum E/lazy: onResume: fHomeFragmentNew{9e9fae3 (0cdc4b8b-167d-420f-9b54-f39bd992f1cc) id=0x7f09012e}
2020-07-06 15:32:16.314 25341-25341/com.massky.sraum E/lazy: onResume: fSceneFragment{2be370c (164843f2-acab-4314-b790-dc0cb4b347bc) id=0x7f09012e}
2020-07-06 15:32:16.316 25341-25341/com.massky.sraum E/lazy: onResume: fMineFragment{70514d1 (37b7a924-8085-4d9c-abcf-21b8f0e551ef) id=0x7f09012e}
2020-07-06 15:32:16.658 25341-25341/com.massky.sraum E/lazy: onStop: acom.massky.sraum.activity.SelectZigbeeDeviceActivityNew@626ebda
2020-07-06 15:32:16.668 25341-25341/com.massky.sraum E/lazy: onDestroy: acom.massky.sraum.activity.SelectZigbeeDeviceActivityNew@626ebda

第二:当我们通过startService启动时候,通过intent传值,在onStartConmon()方法中获取值的时候,一定要先判断intent是否为null。
通过bindService()方式进行绑定,这种方式绑定service,生命周期走法:bindService-->onCreate()-->onBind()-->unBind()-->onDestroy() bingservice 这种方式进行启动service好处是更加便利activity中操作service,
比如加入service中有几个方法,a,b ,如果要在activity中调用,在需要在activity获取ServiceConnection对象,通过ServiceConnection来获取service中内部类的类对象,然后通过这个类对象就可以调用类中的方法,当然这个类需要继承Binder对象
contentProvider:contentProvider的生命周期、理解应该跟进程一样,它作为系统应用组件、其生命周期应该跟app应用的生命周期类似,只是它属于系统应用、所以随系统启动而初始化,随系统关机而结束;但也存在其他状态下结束进程、比如说系统内存不够时,进行内存回收、会根据生成时间态、用户操作等情况进行是否内存回收。
BroadcastReceiver:广播的生命周期从调用开始到onReceiver执行完毕结束,需要注意的是,一般广播的生命周期都极短,需要在10s内处理完onReceiver中的所有工作,所以,一般不进行耗时长的工作,如果有耗时长的工作,应当通过Intent传递给Service进行处理。(注意,不要在onReceiver中开启线程进行耗时任务处理,否则,在10s后,该线程会变成空线程,从而导致任务的丢失。同样的,也不要使用bindService来绑定服务。)
值得注意的是,如果是在代码中动态注册的广播,如:在Activity注册,那么在Activity的onDestory中需要使用unregisterReceiver注销广播。

Activity之间的通信方式
Intent
借助类的静态变量
借助全局变量/Application
借助外部工具 
借助SharedPreference 
使用Android数据库SQLite 
赤裸裸的使用File 
Android剪切板
借助Service

横竖屏切换的时候,Activity 各种情况下的生命周期
分两种情况:
1.不设置Activity的android:configChanges,或设置Activity的android:configChanges="orientation",或设置Activity的android:configChanges="orientation|keyboardHidden",切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行一次。
横竖屏切换造成 activity 的生命周期
onPause()-onSaveInstanceState()-onStop()-onDestroy()-onCreat()-onStart()-onRestoreInstanceState()-onResume()即会导致 activity 的销毁和重建 。

2.配置 android:configChanges="orientation|keyboardHidden|screenSize",才不会销毁 activity,且只调用 onConfigurationChanged方法。
onSaveInstanceState() 与onRestoreIntanceState() 资源相关的系统配置发生改变或者资源不足时(例如屏幕旋转),当前 Activity 会销毁,并且在 onStop 之前回调 onSaveInstanceState 保存数据,在重新创建 Activity 的时候在onStart 之后回调 onRestoreInstanceState。其中 Bundle 数据会传到 onCreate(不一定有数据)和 onRestoreInstanceState(一定有数据)。
用户或者程序员主动去销毁一个 Activity 的时候不会回调(如代码中 finish()或用户按下 back,不会回调),其他情况都会调用,来保存界面信息。

Activity与Fragment之间生命周期比较
a. 在创建的过程中,是 Activity 带领 Fragment 执行生命周期的方法,所以它们生命周期执行的顺序如下:

Activity -- onCreate() ,
          
Fragment -- onAttach() -> onCreate() -> onCreateView() -> onActivityCreated

.



Fragment -- onStart()
Activity -- onStart()



Activity -- onResume()

Fragment -- onResume()


最后,在销毁时是 Fragment 带领 Activity 执行生命周期的方法:

Fragment -- onPause()

Activity -- onPause()


Fragment -- onStop()

Activity -- onStop()


Fragment -- onDestroyView() -> onDestroy() -> onDetach()

Activity -- onDestroy()

Activity上有Dialog的时候按Home键时的生命周期
有 Dialog 和 无 Dialog 按 Home 键效果一样:

正常启动: onCreate() -> onStart() -> onResume()
按 home 键: onPause() -> onStop()
再次启动: onRestart() -> onStart() -> onResume()


两个Activity 之间跳转时必然会执行的是哪几个方法?
a. 正常情况下 Activity A 跳转到 Activity B 时:
A调用 onCreate() 方法 -> onStart() 方法 -> onResume() 方法,此时 A 前台可见。当 A 跳转到 B 时,
A 调用 onPause() 方法,然后调用新的 Activity B 中的 onCreate() 方法 -> onStart() 方法 -> onResume() 方法。
最后 A 再调用onStop()方法。


onPause 
B    onCreat onStart onResume     
A onStop

b. 当 Activity B 为透明主题时:
除了最后 Activity A 不调用 onStop() 方法之外,其它都和 a 中的一样。

Activity的四种启动模式对比
此处延伸:栈(First In Last Out)与队列(First In First Out)的区别
区别:队列先进先出,栈先进后出
对插入和删除操作的"限定"。 栈是限定只能在表的一端进行插入和删除操作的线性表。 队列是限定只能在表的一端进行插入和在另一端进行删除操作的线性表。
遍历数据速度不同

standard 模式
这是默认模式,每次激活Activity时都会创建Activity实例,并放入任务栈中。使用场景:大多数Activity。
activitry task


singleTop 模式
如果在任务的栈顶正好存在该Activity的实例,就重用该实例( 会调用实例的 onNewIntent() ),
否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例,只要不在栈顶,都会创建新的实例。
使用场景如新闻类或者阅读类App的内容页面。


singleTask 模式
如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的 onNewIntent() )。
重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。
如果栈中不存在该实例,将会创建新的实例放入栈中。
使用场景如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,
并且会清空主界面上面的其他页面。


singleInstance 模式
在一个新栈中创建该Activity的实例,并让多个应用共享该栈中的该Activity实例。
一旦该模式的Activity实例已经存在于某个栈中,
任何应用再激活该Activity时都会重用该栈中的实例( 会调用实例的 onNewIntent() )。
其效果相当于多个应用共享一个应用,不管谁激活该 Activity 都会进入同一个应用中。
使用场景如闹铃提醒,将闹铃提醒与闹铃设置分离。
singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,
比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。


Activity状态保存于恢复
当 Activity 在异常情况( 系统内存不足或者系统配置发生了改变等 )被销毁重建后, 
在销毁的时候 Activity 会调用 onSaveInstanceState() 方法用于保存 Activity 相关的状态和数据,
然后在重建后的 Activity 的中我们可以通过 onCreate() 或者 onRestoreInstanceState() 方法恢复数据,
这里我们需要注意的是如果通过 onCreate() 方法恢复,那么得先判断它的 intent 参数 是否为空,
如果在 onRestoreInstanceState() 方法恢复就不会,因为只要 onRestoreInstanceState() 
方法被调用就说明一定有数据,不会为空。Google 推荐使用 onRestoreInstanceState() 方法。

如何实现Fragment的滑动?
将Fragment与viewpager绑定,通过viewpager中的touch事件,会进行move事件的滑动处理。

fragment之间传递数据的方式?
1、在fragment中设置一个方法,然后进行调用
2、采取接口回调的方式进行数据传递。
3、广播或者是使用三方开源框架:EventBus

Activity 怎么和Service 绑定?怎么在Activity 中启动自己对应的Service?
1、activity能进行绑定得益于Serviece的接口。为了支持Service的绑定,实现onBind方法。
2、Service和Activity的连接可以用ServiceConnection来实现。需要实现一个新的ServiceConnection,重现onServiceConnected和OnServiceDisconnected方法,一旦连接建立,就能得到Service实例的引用。
3、执行绑定,调用bindService方法,传入一个选择了要绑定的Service的Intent(显示或隐式)和一个你实现了的ServiceConnection的实例

service和activity怎么进行数据交互?
1.通过 broadcast:通过广播发送消息到 activitry
2.通过 Binder:通过与 activity 进行绑定
(1)添加一个继承 Binder 的内部类,并添加相应的逻辑方法。
(2)重写 Service 的 onBind 方法,返回我们刚刚定义的那个内部类实例。
(3)Activity 中创建一个 ServiceConnection 的匿名内部类,
并且 重 写 里 面 的 onServiceConnected 方 法 和onServiceDisconnected 方法,这两个方法分别会在活动与服务成功绑定以及解除绑定的时候调用(在onServiceConnected方法中,我们可以得到一个刚才那个 service 的 binder 对象,通过对这个 binder 对象进行向下转型,得到我们那个自定义的 Binder 实例,有了这个实例,做可以调用这个实例里面的具体方法进行需要的操作了)。

Service的开启方式,请描述一下Service 的生命周期,请描述一下Service 的生命周期
service 启动方式有两种,一种是通过startService()方式进行启动,另一种是通过bindService()方式进行启动。不同的启动方式他们的生命周期是不一样.
通过startService()这种方式启动的service,生命周期是这样:调用startService() --> onCreate()--> onStartConmon()--> onDestroy()。这种方式启动的话,需要注意一下几个问题,第一:当我们通过startService被调用以后,多次在调用startService(),onCreate()方法也只会被调用一次,而onStartConmon()会被多次调用当我们调用stopService()的时候,onDestroy()就会被调用,从而销毁服务。第二:当我们通过startService启动时候,通过intent传值,在onStartConmon()方法中获取值的时候,一定要先判断intent是否为null。
通过bindService()方式进行绑定,这种方式绑定service,生命周期走法:bindService-->onCreate()-->onBind()-->unBind()-->onDestroy() bingservice 这种方式进行启动service好处是更加便利activity中操作service,比如加入service中有几个方法,a,b ,如果要在activity中调用,在需要在activity获取ServiceConnection对象,通过ServiceConnection来获取service中内部类的类对象,然后通过这个类对象就可以调用类中的方法,当然这个类需要继承Binder对象

请描述一下广播BroadcastReceiver的理解
广播,是一个全局的监听器,属于Android四大组件之一。Android 广播分为两个角色:广播发送者、广播接收者。作用是监听 / 接收 应用 App 发出的广播消息,并 做出响应
可应用在:
Android不同组件间的通信(含 :应用内 / 不同应用之间)
多线程通信
与 Android 系统在特定情况下的通信
如:电话呼入时、网络可用时

Broadcast注册方式与区别 (此处延伸:什么情况下用动态注册)
Broadcast广播,注册方式主要有两种.
第一种是静态注册,也可成为常驻型广播,这种广播需要在Androidmanifest.xml中进行注册,这中方式注册的广播,不受页面生命周期的影响,即使退出了页面,也可以收到广播这种广播一般用于想开机自启动啊等等,由于这种注册的方式的广播是常驻型广播,所以会占用CPU的资源。
第二种是动态注册,而动态注册的话,是在代码中注册的,这种注册方式也叫非常驻型广播,收到生命周期的影响,退出页面后,就不会收到广播,我们通常运用在更新UI方面。这种注册方式优先级较高。最后需要解绑,否会会内存泄露
广播是分为有序广播和无序广播。

在manifest 和代码中如何注册和使用BroadcastReceiver?
          

本地广播和全局广播有什么差别?
BroadcastReceiver是针对应用间、应用与系统间、应用内部进行通信的一种方式
LocalBroadcastReceiver仅在自己的应用内发送接收广播,也就是只有自己的应用能收到,数据更加安全广播只在这个程序里,而且效率更高。

BroadcastReceiver,LocalBroadcastReceiver 区别
一、应用场景不同
1、BroadcastReceiver用于应用之间的传递消息;
2、而LocalBroadcastManager用于应用内部传递消息,比broadcastReceiver更加高效。
二、使用安全性不同
1、BroadcastReceiver使用的Content API,所以本质上它是跨应用的,所以在使用它时必须要考虑到不要被别的应用滥用;
2、LocalBroadcastManager不需要考虑安全问题,因为它只在应用内部有效。

AlertDialog,popupWindow区别
(1)Popupwindow在显示之前一定要设置宽高,Dialog无此限制。
(2)Popupwindow默认不会响应物理键盘的back,除非显示设置了popup.setFocusable(true);而在点击back的时候,Dialog会消失。
(3)Popupwindow不会给页面其他的部分添加蒙层,而Dialog会。

(4)Popupwindow没有标题,Dialog默认有标题,可以通过dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);取消标题
(5)二者显示的时候都要设置Gravity。如果不设置,Dialog默认是Gravity.CENTER。
(6)二者都有默认的背景,都可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
最本质的区别:AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。

讲解一下Context 
Context是一个抽象基类。在翻译为上下文,也可以理解为环境,是提供一些程序的运行环境基础信息。Context下有两个子类,ContextWrapper是上下文功能的封装类,而ContextImpl则是上下文功能的实现类。而ContextWrapper又有三个直接的子类, ContextThemeWrapper、Service和Application。其中,ContextThemeWrapper是一个带主题的封装类,而它有一个直接子类就是Activity,所以Activity和Service以及Application的Context是不一样的,只有Activity需要主题,Service不需要主题。Context一共有三种类型,分别是Application、Activity和Service。这三个类虽然分别各种承担着不同的作用,但它们都属于Context的一种,而它们具体Context的功能则是由ContextImpl类去实现的,因此在绝大多数场景下,Activity、Service和Application这三种类型的Context都是可以通用的。不过有几种场景比较特殊,比如启动Activity,还有弹出Dialog。出于安全原因的考虑,Android是不允许Activity或Dialog凭空出现的,一个Activity的启动必须要建立在另一个Activity的基础之上,也就是以此形成的返回栈。而Dialog则必须在一个Activity上面弹出(除非是System Alert类型的Dialog),因此在这种场景下,我们只能使用Activity类型的Context,否则将会出错。
getApplicationContext()和getApplication()方法得到的对象都是同一个application对象,只是对象的类型不一样。
Context数量 = Activity数量 + Service数量 + 1 (1为Application)

performCreateView  onCreateView   onViewCreated


onCreate  onStart onRestart onResume   onPause onDestroy

       void onActivityStarted(Activity activity);
       
       onActivityStarted onActivityResumed
       
       startService onStop

       bindService--

orientation|keyboardHidden  orientation        
       
 onPause onSaveInstanceState onStop onDestroy onCreat 
 onStart  onRestoreInstanceState onResume
 
 orientation|keyboardHidden|screenSize 
 
 onConfigurationChanged方法。
 
   mFragments.dispatchCreate();
        getApplication().dispatchActivityCreated(this, savedInstanceState);
          f.onAttach(mActivity);
          
    Activity    Create 
                Fragment onAttach onCreate onCreateView onActivityCreated


          
        Fragment  onDestroyView    onDestroy onDetach
        
        onPause onStop
        
        
            @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    public void onViewStateRestored(Bundle savedInstanceState) {
        super.onViewStateRestored(savedInstanceState);
    }
    
    Fragment
    onSaveInstanceState onViewStateRestored
    
    singleInstance (新任务栈) onNewIntent
    
    standard 
    
    singleTask    onNewIntent


    singleTop    newIntent
    
    onSaveInstanceState
    
    onRestoreInstanceState
    
      private class PagerObserver extends DataSetObserver {
        PagerObserver() {
        }

        @Override
        public void onChanged() {
            dataSetChanged();
        }
        @Override
        public void onInvalidated() {
            dataSetChanged();
        }
    }

    
    DataSetObserver  onChanged 
                            requestParentDisallowInterceptTouchEvent(true);
                            
                               ViewParent parent = getParent();
                        if (parent != null) {
                            parent.requestDisallowInterceptTouchEvent(true);
                        }
                        
                        
                        requestDisallowInterceptTouchEvent 
                        
                        
                        
                        
        EventBus BroadcastReceiver。接口                 
                        
        onBind                
                        
           @Override
        public void onServiceConnected(ComponentName component, IBinder service) {
            if (DEBUG) {
                Slog.d(TAG, "onServiceConnected(component=" + component + ")");
            }
            synchronized (mLock) {
                UserState userState = getUserStateLocked(mUserId);
                ServiceState serviceState = userState.serviceStateMap.get(mComponent);
                serviceState.service = ITvInputService.Stub.asInterface(service);

                // Register a callback, if we need to.
                if (serviceState.isHardware && serviceState.callback == null) {
                    serviceState.callback = new ServiceCallback(mComponent, mUserId);
                    try {
                        serviceState.service.registerCallback(serviceState.callback);
                    } catch (RemoteException e) {
                        Slog.e(TAG, "error in registerCallback", e);
                    }
                }                
                        
             @Override
    public final IBinder onBind(Intent intent) {
        return new ITvInputService.Stub() {
            @Override
            public void registerCallback(ITvInputServiceCallback cb) {
                if (cb != null) {
                    mCallbacks.register(cb);
                }
            }
            
    onBind    new    Stub(Binder) registerCallback  ServiceConnection   Stub.asInterface service.registerCallback

 

public boolean bindService(Intent service, ServiceConnection conn,
            int flags) {

bindService   service,ServiceConnection        Binder

            stopService  unBindService    LocalBroadcastManager不需要考虑安全问题,因为它只在应用内部有效。
            
            BroadcastReceiver。
            
             private LocalBroadcastManager(Context context) {
        mAppContext = context;
        mHandler = new Handler(context.getMainLooper()) {

            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case MSG_EXEC_PENDING_BROADCASTS:
                        executePendingBroadcasts();
                        break;
                    default:
                        super.handleMessage(msg);
                }
            }
        };
    }

    getMainLooper        
    
        public PopupWindow(View contentView) {
        this(contentView, 0, 0);
    }

       @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        
           getViewTreeObserver().addOnPreDrawListener(this);
           
           onAttachedToWindow  addOnPreDrawListener
           
           mPopup.setWidth(widthSpec);
            mPopup.setHeight(heightSpec);
            
            
              PopupWindowCompat.showAsDropDown(mPopup, getAnchorView(), mDropDownHorizontalOffset,
              
              dispatchKeyEvent
                 if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
                if (getKeyDispatcherState() == null) {
                    return super.dispatchKeyEvent(event);
                }

                          popupViewContainer.setBackground(mBackground);
                          
                         boolean enqueueMessage(Message msg, long when) {  
                            public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }
    
    enqueueMessage  dispatchMessage          handleMessage
    
    /** @hide */
    @Override
    public Looper getSubtitleLooper() {
        return Looper.getMainLooper();
    }
    
         mHandler = new Handler(mAnchor.getSubtitleLooper(), mCallback);
          private final Handler.Callback mCallback = new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
        
            public static void loop() {
        final Looper me = myLooper();
          msg.target.dispatchMessage(msg);
            if (Looper.myLooper() == mHandler.getLooper()) {
            mHandler.dispatchMessage(m);
        } else {
            mHandler.sendMessage(m);
        }
        
        
        Handler Callback         handleMessage      loop    dispatchMessage    getLooper sendMessage

             new Thread() {
            @Override
            public void run() {
                // Set up a looper to be used by camera.
                Looper.prepare();
                Log.v(TAG, "start loopRun");
                // Save the looper so that we can terminate this thread 
                // after we are done with it.
                mLooper = Looper.myLooper();
                mCamera = Camera.open(CAMERA_ID);
                startDone.open();
                Looper.loop();  // Blocks forever until Looper.quit() is called.
                Log.v(TAG, "initializeMessageLooper: quit.");
            }
        }.start();
        
        prepare loop

 

        public class Activity extends ContextThemeWrapper

public class ContextThemeWrapper extends ContextWrapper {

 */
public class ContextWrapper extends Context {


class ReceiverRestrictedContext extends ContextWrapper {

class ContextImpl extends Context {

public final class ActivityThread {
       receiver.onReceive(context.getReceiverRestrictedContext(),
             mSystemContext = ContextImpl.createSystemContext(this);
}

public abstract class Service extends ContextWrapper implements ComponentCallbacks2 {


public class Application extends ContextWrapper implements ComponentCallbacks2 {


public abstract class BackupAgent extends ContextWrapper {

public class MutableContextWrapper extends ContextWrapper {

    private static class TestContext extends ContextWrapper {
    
    ContextWrapper 包装Context
        @Override
    public boolean deleteFile(String name) {
        return mBase.deleteFile(name);
    }
    
    Context
      public abstract boolean deleteFile(String name);
    


    ContextImpl实现Context
    
        @Override
    public boolean deleteFile(String name) {
        File f = makeFilename(getFilesDir(), name);
        return f.delete();
    }
    
    ContextThemeWrapper        Theme)相关的接口,这里所说的主题就是指在AndroidManifest
        public ContextThemeWrapper(Context base, @StyleRes int themeResId) {
        super(base);
        mThemeResource = themeResId;
    }
    
    ActivityThread
       ContextImpl appContext = ContextImpl.createActivityContext(
                this, r.packageInfo, r.token, displayId, r.overrideConfig);
    
    
    
      static ContextImpl createAppContext(ActivityThread mainThread, LoadedApk packageInfo) {
    
    
        static ContextImpl createSystemContext(ActivityThread mainThread) {
    
    Activity
    singleTask
    
        public final Application getApplication() {
        return mApplication;
    }
    
    ContextImpl
    
        @Override
    public Context getApplicationContext() {
        return (mPackageInfo != null) ?
                mPackageInfo.getApplication() : mMainThread.getApplication();
    }
    
    
    getInstance Context        GC static Singleton
    
    
    ImageView this
    static Drawable      setImageDrawable mDrawable
    
    
    
        public ImageView(Context context) {
        super(context);
        initImageView();
    }
    
    
    
    
     public void setImageDrawable(@Nullable Drawable drawable) {
        if (mDrawable != drawable) {
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值