1.JobSchedulerç使ç¨ååç
2.Android常è§ç¥è¯ç¹
3.一文分析Binder机制和AIDL的理解
4.Android基础知识——四大组件
5.Android N å大ç»ä»¶çå·¥ä½åç
JobSchedulerç使ç¨ååç
JobScheduler主è¦ç¨äºå¨æªæ¥æ个æ¶é´ä¸æ»¡è¶³ä¸å®æ¡ä»¶æ¶è§¦åæ§è¡æ项任å¡çæ åµï¼æ¶åçæ¡ä»¶å¯ä»¥æ¯ç½ç»ãçµéãæ¶é´çï¼ä¾å¦æ§è¡ç¹å®çç½ç»ãæ¯å¦åªå¨å çµæ¶æ§è¡ä»»å¡çãJobSchedulerç±»è´è´£å°åºç¨éè¦æ§è¡çä»»å¡åéç»æ¡æ¶ï¼ä»¥å¤å¯¹è¯¥åºç¨Jobçè°åº¦ï¼æ¯ä¸ä¸ªç³»ç»æå¡ï¼å¯ä»¥éè¿å¦ä¸æ¹å¼è·åï¼
JobInfoæ¯ä¼ éç»JobSchedulerç±»çæ°æ®å®¹å¨ï¼å®å°è£ äºé对è°ç¨åºç¨ç¨åºè°åº¦ä»»å¡æéçåç§çº¦æï¼ä¹å¯ä»¥è®¤ä¸ºä¸ä¸ªJobInfo对象对åºä¸ä¸ªä»»å¡ï¼JobInfo对象éè¿JobInfo.Builderå建ãå®å°ä½ä¸ºåæ°ä¼ éç»JobSchedulerï¼
JobInfo.Builderæ¯JobInfoçä¸ä¸ªå é¨ç±»ï¼ç¨æ¥å建JobInfoçBuilderç±»ã
JobServiceæ¯JobScheduleræç»åè°ç端ç¹ï¼JobSchedulerå°ä¼åè°è¯¥ç±»ä¸çonStartJob()å¼å§æ§è¡å¼æ¥ä»»å¡ãå®æ¯ä¸ä¸ªç»§æ¿äºJobServiceçæ½è±¡ç±»ï¼å为系ç»åè°æ§è¡ä»»å¡å 容çç»ç«¯ï¼JobScheduleræ¡æ¶å°éè¿bindService()æ¹å¼æ¥å¯å¨è¯¥æå¡ãå æ¤ï¼ç¨æ·å¿ é¡»å¨åºç¨ç¨åºä¸å建ä¸ä¸ªJobServiceçåç±»ï¼å¹¶å®ç°å ¶onStartJob()çåè°æ¹æ³ï¼ä»¥åå¨AndroidManifest.xmlä¸å¯¹å®æäºå¦ä¸æéï¼
注æå¨AndroidManifest.xmlä¸æ·»å æé
å½ä»»å¡å¼å§æ¶ä¼æ§è¡onStartJob(JobParameters params)æ¹æ³ï¼å¦æè¿åå¼æ¯falseï¼åç³»ç»è®¤ä¸ºè¿ä¸ªæ¹æ³è¿åæ¶ï¼ä»»å¡å·²ç»æ§è¡å®æ¯ãå¦æè¿åå¼æ¯trueï¼é£ä¹ç³»ç»è®¤ä¸ºè¿ä¸ªä»»å¡æ£è¦è¢«æ§è¡ï¼æ§è¡ä»»å¡çéæ å°±è½å¨äºä½ çè©ä¸ãå½ä»»å¡æ§è¡å®æ¯æ¶ä½ éè¦è°ç¨jobFinished(JobParameters params, boolean needsRescheduled)æ¥éç¥ç³»ç»ã
å½ç³»ç»æ¥æ¶å°ä¸ä¸ªåæ¶è¯·æ±æ¶ï¼ç³»ç»ä¼è°ç¨onStopJob(JobParameters params)æ¹æ³åæ¶æ£å¨çå¾ æ§è¡çä»»å¡ãå¾éè¦çä¸ç¹æ¯å¦æonStartJob(JobParameters params)è¿åfalseï¼é£ä¹ç³»ç»åå®å¨æ¥æ¶å°ä¸ä¸ªåæ¶è¯·æ±æ¶å·²ç»æ²¡ææ£å¨è¿è¡çä»»å¡ãæ¢å¥è¯è¯´ï¼onStopJob(JobParameters params)å¨è¿ç§æ åµä¸ä¸ä¼è¢«è°ç¨ã
éè¦æ³¨æçæ¯è¿ä¸ªJob Serviceè¿è¡å¨ä¸»çº¿ç¨ï¼è¿æå³çä½ éè¦ä½¿ç¨å线ç¨ï¼handlerï¼æè ä¸ä¸ªå¼æ¥ä»»å¡æ¥è¿è¡èæ¶çæä½ä»¥é²æ¢é»å¡ä¸»çº¿ç¨ã
Googleå®æ¹çSampleï¼ /googlearchive/android-JobScheduler
JobScheduleræ¯ä¸ä¸ªæ½è±¡ç±»ï¼å®å¨ç³»ç»æ¡æ¶çå®ç°ç±»æ¯android.app.JobSchedulerImpl
æ§è¡çå ¥å£æ¯JobScheduler.schedulerï¼å ¶å®æ¯è°äºJobSchedulerImplä¸çscheduleæ¹æ³ï¼ç¶ååè°äºmBinder.schedule(job)ãè¿ä¸ªmBinderå°±æ¯JobSchedulerServiceï¼éè¿Binderè·¨è¿ç¨è°ç¨JobSchedulerServiceã
æåè°ç¨å°JobSchedulerServiceä¸çscheduleæ¹æ³:
æ¥çåéMSG_CHECK_JOBæ¶æ¯ï¼æ¶æ¯å¤ççå°æ¹æ¯
æ¥çæ§è¡JobHandlerä¸ç maybeRunPendingJobsH æ¹æ³ï¼å¤çç¸åºçä»»å¡
availableContextæ¯JobServiceContextï¼å³ServiceConnectionï¼è¿ä¸ªæ¯è¿ç¨é´é讯ServiceConnectionï¼éè¿è°ç¨availableContext.executeRunnableJob(nextPending)æ¹æ³ï¼ä¼è§¦åè°ç¨onServiceConnectedï¼çå°è¿éåºè¯¥æç½äºï¼onServiceConnectedæ¹æ³ä¸çserviceå°±æ¯Jobserviceï¼éé¢è¿ç¨äºWakeLockéï¼é²æ¢ææºä¼ç ã
æ¥çï¼éè¿Handleråæ¶æ¯ï¼è°ç¨äºhandleServiceBoundH()æ¹æ³ã
ä»ä¸é¢æºç å¯ä»¥çåºï¼æç»æ¯è§¦åè°ç¨äºJobServiceä¸çstartJobæ¹æ³ã
ä»æºç çï¼è®¾ç½®çå 容åºç¨äº JobStatus ï¼ä¾å¦ç½ç»éå¶
èå¨JobSchedulerServiceç±»ï¼ç¸å ³çç¶ææ§å¶å¨å ¶æé å½æ°é:
ä¾å¦ç½ç»æ§å¶ç±»ConnectivityControllerç±»
å½ç½ç»åçæ¹åæ¶ï¼ä¼è°ç¨updateTrackedJobs(userid)æ¹æ³ï¼å¨updateTrackedJobsæ¹æ³ä¸ï¼ä¼å¤æç½ç»æ¯å¦ææ¹åï¼ææ¹åçä¼è°mStateChangedListener.onControllerStateChanged()æ¹æ³ï¼ç¶åè°ç¨äºJobSchedulerServiceç±»ä¸onControllerStateChangedæ¹æ³ï¼
æ¥çä¹æ¯å¤çMSG_CHECK_JOB æ¶æ¯ï¼åä¸æä¸æ ·ï¼æç»è§¦åè°ç¨äºJobServiceä¸çstartJobæ¹æ³ã
JobSchedulerServiceæ¯ä¸ä¸ªç³»ç»æå¡ï¼å³åºè¯¥å¨SystemServerå¯å¨çãé 读SystemServerçæºç ï¼
run æ¹æ³å¦ä¸ï¼
æ¥çç startOtherServices()
å æ¤ï¼å¨è¿éå°±å¯å¨äºJobSchedulerServiceæå¡ã
1. android æ§è½ä¼åJobScheduler使ç¨åæºç åæ
2. Android 9.0 JobScheduler(ä¸) JobSchedulerç使ç¨
3. Android 9.0 JobScheduler(äº) JobScheduleræ¡æ¶ç»æç®è¿°åJobSchedulerServiceçå¯å¨
4. Android 9.0 JobScheduler(ä¸) ä»Jobçå建å°æ§è¡
5. Android 9.0 JobScheduler(å) Job约ææ¡ä»¶çæ§å¶
6. ç解JobScheduleræºå¶
Android常è§ç¥è¯ç¹
跳槽æ éå°±æ¯é±å°äºæä¸ç½äºï¼æ 论æä¹æ ·ï¼è®°ä½ï¼ä¸è¦è£¸è¾ï¼
ä¸è¦è£¸è¾ï¼
ä¸è¦è£¸è¾ï¼
为ä»ä¹å¢ï¼
1ã裸è¾å°±æ²¡æé±æ¿äºï¼è¿ä¸å¦éªé©´æ¾é©¬ã
2ã裸è¾ä¹åå¦æä¸ä¸ªæå 没ææ¾å°å·¥ä½ï¼é£ä¹ç¤¾ä¿å°±ä¼æäºï¼é¤éä½ èªå·±æ¾æ¸ é交äºã
3ã裸è¾ä¹åççä¼å¾é¢åºï¼
å½åè¿å¨ä¸ççæ¶åå°±æ³çï¼è£¸è¾äºï¼é¦å è±å 天æ¶é´å§ç®åå®åä¸ä¸ï¼æç¥è¯ç¹æ¶è¡¥ä¸ä¸ï¼ç¶åæç®åï¼é¢è¯ï¼å¦¥å¦¥ç妥妥ã
ç»æå¢ï¼æ¯æ¬¡è£¸è¾ä¹åé½æ¯ï¼
é¦å 躺尸ä¸ä¸ªææï¼
ç¶åç¨äºä¸ä¸ªææææ ¢ååçæ¹å®ç®åï¼
ç¶åæµ·æï¼æ²¡åå¤ï¼ä¿®æ¹ç®åï¼
å次海æï¼é¢è¯ï¼è¢«èå¾ä½æ å®è¤ï¼æç人çï¼
åæ¹ç®åï¼åæµ·æï¼ä¸ä¸å°å¿ä¸äºã
å½ç¶æµ·æä¹æ¯æ个ç®æ èå´çã
å¦æä¸æ¯è£¸è¾ï¼é£ä¹ç°å¨åºè¯¥è¿æ¯å¨å ¬å¸ä¸çï¼å¨å®æå·¥ä½ä¹ä½ï¼å°±ä¼é¼çèªå·±å¤ä¹ ç¥è¯ç¹äºï¼èµ·ç ä¸ä¼å¨å®¶å è½ãå¨å®¶ä¸ä¸çå°±æ¯ç¡è§ãççµå½±ï¼æ¨¯æ©¹ç°é£ççï¼æ以ä¸è¦è£¸è¾ã
ç¶å¹¶åµï¼æä¾ç¶è£¸è¾äºã请åé¢è¯ççå¾ç¦ã
onPauseï¼åå¦ä»ActivityAå¯å¨Bï¼å¦æBæ¯éæçï¼åä¸ä¼åè°AçonStopæ¹æ³ã
æ¹æ³ä¸ï¼
æ¹æ³äºï¼
1ãå好å¨ç»æ件 R.anim.enter ã R.anim.exit
2ãè°ç¨ overridePendingTransition 设置å¨ç»
å¼ç³ï¼å¦Activity设置为singleInstanceï¼ååºè¯¥æä¹è®¾ç½®è·³è½¬å¨ç»ï¼
1ãstartServiceå¯å¨æ¹ä¸Service并没æå ³èï¼åªæå½Serviceè°ç¨ stopSelf æè å ¶å®ç»ä»¶è°ç¨ stopService çæ¶åæå¡æä¼ç»æ¢ã
2ãbindServiceå¯å¨æ¹ç»å®Serviceï¼å¹¶ä¸å¯ä»¥éè¿Binderä¸ä¹äº¤äºï¼å½å¯å¨æ¹éæ¯æ¶ï¼ä¹ä¼èªå¨unbindServiceï¼å½ææå¯å¨æ¹é½unbindServiceä¹åï¼Serviceä¹å°±èªå¨éæ¯äºã
为ä»ä¹å¢ï¼å®æ¹ææ¡£æ¯è¿æ ·åçï¼
大æ¦æææ¯ onReceive() æ§è¡å®æ¯ä¹åï¼å®æå¨çè¿ç¨å°±ä¼åæä½ä¼å 级è¿ç¨ï¼ææ被系ç»ææ»ã
å两ç§æ åµåæä¸ä¸ï¼
ä¸ãæ¶å°å¹¿æçæ¶åï¼åºç¨æ£å¨è¿è¡ï¼
æ¤æ¶å¦æ没æå¨Manifestä¸è®¾ç½®äºç¬ç«è¿ç¨ï¼å onReceive() å°±ç´æ¥å¨ä¸»è¿ç¨ä¸»çº¿ç¨æ§è¡ï¼è¿éå¾ææ¾ä¸è½æ§è¡èæ¶æä½ã
äºãæ¶å°å¹¿æçæ¶åï¼åºç¨æ²¡æå¯å¨ï¼
è¿æ¶åç³»ç»ä¼å¯å¨ä¸ä¸ªè¿ç¨å»æ§è¡ onReceive() ï¼ï¼å¦æManifestä¸æ²¡æ设置è¿ç¨åï¼åè¿ç¨å为å åï¼ï¼(æä¸å¥ï¼ææè¿ç¨é½ä¼å建ä¸ä¸ªApplicationå®ä¾)ï¼å½onReceiveæ§è¡å®æ¯ä¹åï¼æ¤è¿ç¨å°±åæä½ä¼å 级äºï¼éæ¶æå¯è½è¢«ç³»ç»ææ»ï¼å¦æä½ å¨onReceiveéé¢å¯å¨äºçº¿ç¨æ§è¡èæ¶ä»»å¡ï¼é£å¾æå¯è½å线ç¨æ²¡æ§è¡å®æ¯ï¼è¿ç¨å°±è¢«ææ»äºï¼è¿ç¨æ²¡äºï¼çº¿ç¨èªç¶å°±æäºã
é£ä¹ç¡®å®è¦æ§è¡èæ¶æä½å¢ï¼æä¹åï¼
æ¹æ³ä¸ï¼goAsync()
æ¹æ³äºï¼schedule a JobService from the receiver using the JobScheduler
ä¸ç§å®ç°æ¹æ³
1ã继æ¿ç°æçç»ä»¶ï¼å¦TextViewçï¼è¿è¡æå±ã
2ã继æ¿ViewGroupï¼èªå®ä¹å¸å±ã
3ã继æ¿Viewï¼å¨onDraw()ä¸æç»ã
onMeasure()
onLayout()
onDraw()
å ¶å®
attachToRoot ä»åé¢ç解就æ¯æ¯å¦ç»å®å° root ä¸é¢å»äºã
1ã attachToRoot=true ï¼åè¿åçview为rootçåviewï¼
2ã attachToRoot=false ï¼åè¿åçviewæ¯ä¸ªåç¬çviewï¼ä¼ å ¥çrootåªæ¯æä¾ä¸äºåæ°ç»view使ç¨èå·²ã
é£ä¹è¿éä¸ä¼ å ¥ attachToRoot å¢ï¼é£å°±çrootæ¯å¦ä¸ºç©ºäºï¼å¦æä¼ å ¥rootä¸ä¸ºç©ºï¼åé»è®¤ç»å®å°rootï¼ä½ä¸ºrootçåviewè¿åã
ä¹å°±æ¯æè°çFrameå¨ç»ãæéè¿æå®æ¯ä¸å¸§çå¾çåææ¾æ¶é´ï¼æåºçè¿è¡ææ¾èå½¢æå¨ç»ææã
å¯ä»¥éè¿æå ¥å¨ Interpolator æ§å¶å¨ç»çååé度ã
ä¹å°±æ¯æè°è¡¥é´å¨ç»ãæéè¿æå®Viewçåå§ç¶æãååæ¶é´ãæ¹å¼ï¼éè¿ä¸ç³»åçç®æ³å»è¿è¡å¾å½¢åæ¢ï¼ä»èå½¢æå¨ç»ææï¼ä¸»è¦æ AlphaAnimation ã TranslateAnimation ã ScaleAnimation ã RotateAnimation åç§ã
注æï¼åªæ¯å¨è§å¾å±å®ç°äºå¨ç»ææï¼å¹¶æ²¡æçæ£æ¹åViewçå±æ§ã
å±æ§å¨ç»ï¼éè¿ä¸æçæ¹åViewçå±æ§ï¼ä¸æçéç»èå½¢æå¨ç»ææãç¸æ¯äºè§å¾å¨ç»ï¼Viewçå±æ§æ¯çæ£æ¹åäºã
注æï¼Android 3.0(API )以ä¸ææ¯æã
æ常ç¨çç±»æ ObjectAnimator
P.S. æä¸æç½cancelåå¨çæä¹ã
å¦å¤ï¼ DialogFragment æ¯æ²¡æcancelçã
ping
å å大è´å为ä¸ä¸ªåºï¼æ åºãå åºãæ¹æ³åºã
æ åº
å åº
æ¹æ³åº
JAVAä¸å 许æå¨éæ¾å åï¼åªè½éè¿åå¾åæ¶ç¨åºä¸å®æ对é£äºä¸å被å¼ç¨ç对象è¿è¡åæ¶ã
é£ä¹æä¹å¤æåªäºå¯¹è±¡éè¦åæ¶ï¼
1ãå¼ç¨è®¡æ°æ³
å°±æ¯ç»å¯¹è±¡æ·»å ä¸ä¸ªå¼ç¨è®¡æ°å¨ï¼å¼ç¨å¯¹è±¡æ¶+1ï¼å¼ç¨å¤±ææ¶-1ãä½æ¯è¿ç§æ¹æ³è§£å³ä¸äºå¯¹è±¡ç¸äºå¼ç¨çæ åµã
2ãå¯è¾¾æ§åææ³
éè¿ä¸ç³»åâGCRootsâ对象ä½ä¸ºèµ·ç¹è¿è¡æç´¢ï¼å½GCRootsåä¸ä¸ªå¯¹è±¡ä¹é´æ²¡æå¯è¾¾è·¯å¾ï¼å认为æ¤å¯¹è±¡ä¸å¯ç¨ï¼ä½æ¯ä¸å¯ç¨ä¸ä¸å®ä¼æ为å¯åæ¶å¯¹è±¡ã
ç¼åAIDLæ件ï¼å®ä¹æ¥å£ã
ç¼è¯çæJAVAæ件ã
å®ä¹è¿ç¨çº§Serviceï¼onBindä¸è¿åInterface.Stub()ã
onServiceConnectedä¸Interface aidl = Interface.Stub.asInterface(service);
æ已修å¤çclassæ件æå ædexæ件ï¼ç½ç»ä¼ è¾å°ç¨æ·ææºä¸ï¼å©ç¨ç±»å è½½å¨æè¿äºç±»å è½½å°ç±»éåçåé¢å³å¯ã
ãæªå®å¾ ç»ã
å¦æå ¬å¸å½ç¨æï¼ä¸ç®¡æ¯ä¸å¹´è¿æ¯äºå¹´ï¼é¦å æé½ä¼å æå ¬å¸çä»»å¡å好ï¼ç¶åä¸ææ·±å ¥ç 究Androidçç¸å ³ææ¯ï¼ç¹å«æ¯Androidæºç ï¼äºè§£Androidåºå±åçï¼ä»¥ä¾¿æ´å¥½çä¼åæ§è½ï¼é¿å ä¸äºä¸å¿ è¦çå¥è©é®é¢ï¼è¿æå°±æ¯ç 究ä¸äºæ°çæ¡æ¶çåçï¼å¦ä¹ å«äººçæç»´ãæåå°±æ¯å¦ä¹ å¨è¾¹è¯è¨ï¼æ¯å¦åå°ï¼å端ççã
一文分析Binder机制和AIDL的理解
深入了解Android进程间通信机制,如同破解系统奥秘的钥匙,它在源码探索和问题解决中扮演着核心角色。Binder机制,源自OpenBinder,正是mtk modem 源码分析这个领域的主角,它弥补了Linux原生通信方式在性能和安全性的短板。它的运作涉及驱动层与应用层的无缝对接,包括与系统服务如Activity Manager Service (AMS) 的深度协作。 Binder,作为Java编写的通信工具包,是Android多进程通信的基石。尽管AIDL(Android Interface Definition Language)常用于简化这一过程,但并非不可或缺。让我们通过一个实例,奶茶 源码不依赖AIDL,来揭示Binder通信的内在机制。想象一个简单的场景:一个客户端(ClientBinder)与服务端(ServerBinder,继承自Binder并实现onTransact方法)之间的字符串传递,透彻理解Binder通信的运作原理。 项目框架中,服务端在Service的onBind方法中返回一个ServerBinder实例。对比手动实现与AIDL生成的代码,AIDL的便捷性便一目了然。客户端通过ServiceConnection,如下面这段代码,与远程服务建立连接:1. 创建ServiceConnection,获取远程服务的IBinder
2. intent设置服务类名:"com.binder.server.RemoteService"
3. bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
4. 若未连接,尝试bindService
5. 传递数据:通过IBinder调用mStingEditText的armminer源码文本,如data.writeString(text)
6. 成功连接后,调用transact方法传递请求
接收数据的环节,服务端将数据展示在tvShowMessage上,通过新线程处理,如`new Handler().post(() -> ServerMainActivity.tvShowMessage.setText(message));`。当连接断开时,serviceConnection的onServiceDisconnected方法会被触发。 关键在于客户端如何通过IBinder获取服务端对象并调用transact进行跨进程通信。AIDL的引入让这个过程更加优雅,例如在ClientMainActivityUseAidl中,服务连接成功后,通过IBinder代理mServer,调用自定义接口IShowMessageAidlInterface的showMessage方法。 在交互过程中,value源码客户端通过IShowMessageAidlInterface的Stub内部类,将本地的IBinder转换为接口,这样数据的发送就通过showMessage方法进行。AIDL的asInterface方法负责封装本地或远程处理,Proxy类则负责数据的打包和跨进程传输,确保数据的无缝传递。 总结来说,客户端利用AIDL的asInterface处理远程IBinder,而Proxy类则是这一切的幕后功臣。服务端的onBind方法返回AIDL生成的Stub,它在客户端调用transact时负责接收和处理请求,执行showMessage方法。这样,AIDL生成的workbook 源码Stub和Proxy成为客户端发送数据的桥梁,而在服务端,它们则是数据处理的核心所在。 掌握Binder机制和AIDL的精髓,你将解锁Android进程间通信的无尽可能,为你的应用开发增添无限力量。无论何时,当你深入探索Android源码,这些核心原理都将是你不可或缺的指南。Android基础知识——四大组件
Android是一种基于Linux的自由及开放源代码的操作系统,其主要分为四个层,从上到下分别是应用程序层、应用程序框架层、系统运行库层和Linux内核层。Android系统拥有四大基本组件:Activity、Service服务、BroadcastReceiver广播接收器、Content Provider内容提供者。其中,Activity是一个应用程序组件,提供一个与用户交互的界面;Service服务为长生命周期的后台服务程序,没有可视化界面;BroadcastReceiver用于监听应用发出的广播消息,并做出响应;Content Provider作为应用程序之间共享数据的途径,提供统一接口用于存储和读取数据。
Activity介绍:Activity是一个负责与用户交互的组件,显示在屏幕上的每一个界面都是一个Activity实例。Activity可以监听并处理用户的事件做出响应,并且可以显示一些控件。所有操作都与用户密切相关。Activity之间通过Intent进行通信。Activity有四种基本状态:Active/Running(激活状态或运行状态)、Paused(暂停状态)、Stopped(停止状态)、Killed(销毁状态)。当一个Activity实例被创建、销毁或者启动另一个Activity时,它会在这四种状态之间进行转换。Activity栈通过管理Activity实例的状态来控制它们在屏幕上的显示顺序。
Service介绍:Service是运行于后台,没有可视化界面的一种服务程序。它可以通过两种方式启动:Started Service(通过其他组件调用startService()创建,可以无限运行,需要调用stopSelf()或stopService()停止)和Bounded Service(通过其他组件调用bindService()创建,可以与多个组件进行通信,当所有绑定组件解除后,系统会销毁Service)。
BroadcastReceiver介绍:BroadcastReceiver是监听应用发出的广播消息,并做出响应的组件。它可以用于不同组件之间通信、与Android系统通信等场景。Android广播使用观察者模式实现,基于消息的发布/订阅事件模型。注册BroadcastReceiver有静态注册和动态注册两种方式。静态注册在AndroidManifest.xml中声明,常驻注册不受组件生命周期影响;动态注册在代码中通过Context的registerReceiver()方法进行,需要在组件生命周期结束时注销。
Content Provider介绍:Content Provider是Android应用程序组件之一,作为应用程序之间共享数据的途径,提供统一接口用于存储和检索数据。Content Provider主要功能是存储、检索数据以及向其他应用程序提供访问数据的接口。Android系统内置了多个Content Provider用于管理不同数据类型,如音乐、视频、图像、联系人信息等。访问Content Provider中的数据主要通过ContentResolver对象,支持查询、插入、修改、删除操作。实现Content Provider需要定义CONTENT_URI常量、继承Content Provider类、实现相关方法,并在AndroidManifest.xml中声明。
Android N å大ç»ä»¶çå·¥ä½åç
æ¬æ侧é讲解android N ç³»ç»ä¸å大ç»ä»¶çå·¥ä½åçï¼ä¸åç³»ç»åçç¥æå·®å«ãéè¿åæå大ç»ä»¶çå·¥ä½æµç¨å 深对Android Frameworkçç解ï¼ä¹ä¸ºæ件åå¼åæä¸åºç¡ã
Activity
å±ç¤ºä¸ä¸ªçé¢å¹¶åç¨æ·äº¤äºï¼å®æ®æ¼çæ¯ä¸ä¸ªåå°çé¢çè§è²ã
Service
计ç®åç»ä»¶ï¼ç¨äºåå°æ§è¡ä¸ç³»å计ç®ä»»å¡ï¼å·¥ä½å¨ä¸»çº¿ç¨ï¼èæ¶æä½éè¦å¦èµ·çº¿ç¨ï¼ å为å¯å¨ç¶æåç»å®ç¶æã
BroadcastReceiver
æ¶æ¯åç»ä»¶ï¼ä¸»è¦ç¨äºä¸åç»ä»¶æè ä¸ååºç¨ä¹é´çæ¶æ¯ä¼ éï¼å®å·¥ä½å¨ç³»ç»å é¨ï¼ä¸éåæ§è¡èæ¶æä½ï¼æä½è¶ è¿5sï¼ä¼åºç°ANRã
ContentProvider
æ°æ®å ±äº«åç»ä»¶ï¼ç¨äºåå ¶ä»ç»ä»¶æè åºç¨å ±äº«æ°æ®ï¼ä¸»è¦æ§è¡CURDæä½ã
æ们å¯å¨ä¸ä¸ªactivityæ两ç§æ¹æ³ï¼
第ä¸ç§ï¼Activityç´æ¥å¯å¨æ¹å¼ï¼ï¼
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
第äºç§ï¼Contextå¯å¨æ¹å¼ï¼
Intent intent = new Intent(this, MainActivity.class);
getApplicationContext().startActivity(intent);
ä¸åçå¯å¨æ¹å¼Activityçå·¥ä½æµç¨æç¹å·®å«ã
两ç§å¯å¨é½ä¼è°ç¨å°Instrumentationç±»ä¸çexecStartActivityçæ¹æ³ï¼ç³»ç»æç»æ¯éè¿ActivityThreadä¸çperformLaunchActivityå®æActivityçå建åå¯å¨ã
performLaunchActivityæ¹æ³ä¸»è¦å®æ以ä¸å·¥ä½ï¼
1ãéè¿ActivityClientRecord对象è·åå¯å¨activityçç»ä»¶ä¿¡æ¯
2ãéè¿mInstrumentation对象çnewActivityæ¹æ³è°ç¨classloaderå®æactivityçå建
3ãéè¿r.packageInfo(LoadedApk 对象)çmakeApplicationæ¹æ³å°è¯å建Application对象
4ãå建ContextImpl对象并è°ç¨Activityçattachæ¹æ³å®æä¸äºæ°æ®çåå§å
5ãè°ç¨ActivityçonCreateæ¹æ³
å¨Activityå¯å¨çè¿ç¨ä¸ï¼Appè¿ç¨ä¼é¢ç¹å°ä¸AMSè¿ç¨è¿è¡éä¿¡ï¼
Appè¿ç¨ä¼å§æAMSè¿ç¨å®æActivityçå½å¨æç管ç以åä»»å¡æ ç管çï¼è¿ä¸ªéä¿¡è¿ç¨AMSæ¯Server端ï¼Appè¿ç¨éè¿ææAMSçclient代çIActivityManagerå®æéä¿¡è¿ç¨ï¼
AMSè¿ç¨å®æçå½å¨æ管ç以åä»»å¡æ 管çåï¼ä¼ææ§å¶æ交ç»Appè¿ç¨ï¼è®©Appè¿ç¨å®æActivity类对象çå建ï¼ä»¥åçå½å¨æåè°ï¼è¿ä¸ªéä¿¡è¿ç¨ä¹æ¯éè¿Binderå®æçï¼Appæå¨server端çBinder对象åå¨äºActivityThreadçå é¨ç±»ApplicationThreadï¼AMSæå¨clientéè¿ææIApplicationThreadç代ç对象å®æ对äºAppè¿ç¨çéä¿¡ã
Serviceæ两ç§å¯å¨æ¹å¼ï¼startService()åbindService()ï¼ä¸¤ç§ç¶æå¯ä»¥å¹¶å:
startServiceæµç¨
bindServiceæµç¨
BroadcastReceiverçå·¥ä½è¿ç¨ä¸»è¦å æ¬å¹¿æç注åãåéåæ¥æ¶:
å¨æ注åè¿ç¨ï¼
åéè¿ç¨
éæ注åæ¯ç±PackageManagerServiceï¼PMSï¼å¨åºç¨å®è£ çæ¶åå®ææ´ä¸ªæ³¨åè¿ç¨çï¼é¤å¹¿æ以å¤ï¼å ¶ä»ä¸å¤§ç»ä»¶ä¹é½æ¯å¨åºç¨å®è£ æ¶ç±PMS解æ并注åçã
æ¯ä¸ªè¿ç¨çå ¥å£é½æ¯ActivityThead.main()ï¼Appçå¯å¨æµç¨å¦ä¸ï¼
ä»æºç ä¸å¯ä»¥çåºï¼
åºç¨å¯å¨çå ¥å£ä¸ºActivityThreadçmainæ¹æ³ï¼mainæ¹æ³ä¼å建ActivityThreadå®ä¾å¹¶å建主线ç¨æ¶æ¯éåã
attachæ¹æ³ä¸è¿ç¨è°ç¨AMSçattachApplicationæ¹æ³ï¼å¹¶æä¾ApplicationThreadç¨äºåAMSçéä¿¡ã
attachApplicationæ¹æ³ä¼éè¿bindApplicationæ¹æ³åHæ¥è°åActivityThreadçhandleBindApplicationï¼è¿ä¸ªæ¹æ³ä¼å å建Applicationï¼åå è½½ContentProviderï¼ç¶åæä¼åè°ApplicationçonCreateæ¹æ³ã
ç±ä¸å¾å¯ä»¥çåºï¼å¨ContentProviderçå¯å¨è¿ç¨ä¸ä¼´éçappè¿ç¨çå¯å¨ã
ContentProviderçå ¶ä»CURDæä½å¦insertï¼deleteï¼updateè·queryçæµç¨ç±»ä¼¼ã