欢迎来到皮皮网官网

【fh admin源码下载】【测速源码net】【string 源码讲解】静态注册源码_静态注册源码是什么

时间:2024-12-23 09:50:55 来源:进程内核源码

1.Nacos 注册服务源码分析
2.Android基础知识——四大组件
3.Android N 四大组件的工作原理
4.android broadreceiver 运行在哪个进程

静态注册源码_静态注册源码是静态静态什么

Nacos 注册服务源码分析

       Nacos 注册服务源码分析

       首先,从nacos-example样例工程入手,注册注册寻找注册服务的源码源码fh admin源码下载关键入口。在NamingExample的静态静态main方法中,我们关注的注册注册测速源码net两行代码揭示了整个过程的起点。

       从NamingFactory#createNamingService开始,源码源码string 源码讲解这个方法通过构造函数创建了一个NacosNamingService。静态静态值得注意的注册注册是,虽然创建过程看似简单,源码源码但构造方法中包含了属性的静态静态初始化和处理,这在非Spring项目中尤为重要,注册注册通常通过静态代码块或构造方法自行完成。源码源码

       真正注册服务的静态静态手机彩票 源码核心在于registerInstance方法。这个方法内部调用了clientProxy.registerService,注册注册跟踪这个过程是源码源码max直播源码理解Nacos注册服务的关键。

       进一步追踪NamingService的构造方法,可以看到它内部创建了NamingClientProxyDelegate代理类。这个代理类实际上是设计模式中的代理模式,用于将请求委托给grpcClientProxy或.example.corn";

        3     private BroadcastReceiver mBroadcastReceiver;

        4

        5     @Override

        6     protected void onCreate(Bundle savedInstanceState) {

        7         super.onCreate(savedInstanceState);

        8         setContentView(R.layout.activity_main);

        9

                mBroadcastReceiver = new MyBroadcastReceiver();

                IntentFilter intentFilter = new IntentFilter();

                intentFilter.addAction(BROADCAST_ACTION);

                registerReceiver(mBroadcastReceiver, intentFilter);

            }

           

            @Override

            protected void onDestroy() {

                super.onDestroy();

                unregisterReceiver(mBroadcastReceiver);

            }

       

        }

       æ³¨ï¼šAndroid中所有与观察者模式有关的设计中,一旦涉及到register,必定在相应的时机需要unregister。因此,上例在onDestroy()回到中需要unregisterReceiver(mBroadcastReceiver)。

       å½“æ­¤Activity实例化时,会动态将MyBroadcastReceiver注册到系统中。当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。

        

       3.广播发送及广播类型

       ç»å¸¸è¯´â€å‘送广播“和”接收“,表面上看广播作为Android广播机制中的实体,实际上这一实体本身是并不是以所谓的”广播“对象存在的,而是以”意图“(Intent)去表示。定义广播的定义过程,实际就是相应广播”意图“的定义过程,然后通过广播发送者将此”意图“发送出去。被相应的BroadcastReceiver接收后将会回调onReceive()函数。

       ä¸‹æ®µä»£ç ç‰‡æ®µæ˜¾ç¤ºçš„是一个普通广播的定义过程,并发送出去。其中setAction(..)对应于BroadcastReceiver中的intentFilter中的action。

       1 Intent intent = new Intent();

       2 intent.setAction(BROADCAST_ACTION);

       3 intent.putExtra("name", "qqyumidi");

       4 sendBroadcast(intent);

       æ ¹æ®å¹¿æ’­çš„发送方式,可以将其分为以下几种类型:

       1.Normal Broadcast:普通广播

       2.System Broadcast: 系统广播

       3.Ordered broadcast:有序广播

       4.Sticky Broadcast:粘性广播(在 android 5.0/api 中deprecated,不再推荐使用,相应的还有粘性有序广播,同样已经deprecated)

       5.Local Broadcast:App应用内广播

       ä¸‹é¢åˆ†åˆ«æ€»ç»“下各种类型的发送方式及其特点。

       1).Normal Broadcast:普通广播

       æ­¤å¤„将普通广播界定为:开发者自己定义的intent,以context.sendBroadcast_"AsUser"(intent, ...)形式。具体可以使用的方法有:

       sendBroadcast(intent)/sendBroadcast(intent, receiverPermission)/sendBroadcastAsUser(intent, userHandler)/sendBroadcastAsUser(intent, userHandler,receiverPermission)。

       æ™®é€šå¹¿æ’­ä¼šè¢«æ³¨å†Œäº†çš„相应的感兴趣(intent-filter匹配)接收,且顺序是无序的。如果发送广播时有相应的权限要求,BroadCastReceiver如果想要接收此广播,也需要有相应的权限。

       2).System Broadcast: 系统广播

       Android系统中内置了多个系统广播,只要涉及到手机的基本操作,基本上都会发出相应的系统广播。如:开启启动,网络状态改变,拍照,屏幕关闭与开启,点亮不足等等。每个系统广播都具有特定的intent-filter,其中主要包括具体的action,系统广播发出后,将被相应的BroadcastReceiver接收。系统广播在系统内部当特定事件发生时,有系统自动发出。

       3)Ordered broadcast:有序广播

       æœ‰åºå¹¿æ’­çš„有序广播中的“有序”是针对广播接收者而言的,指的是发送出去的广播被BroadcastReceiver按照先后循序接收。有序广播的定义过程与普通广播无异,只是其的主要发送方式变为:sendOrderedBroadcast(intent, receiverPermission, ...)。

       å¯¹äºŽæœ‰åºå¹¿æ’­ï¼Œå…¶ä¸»è¦ç‰¹ç‚¹æ€»ç»“如下:

       1>多个具当前已经注册且有效的BroadcastReceiver接收有序广播时,是按照先后顺序接收的,先后顺序判定标准遵循为:将当前系统中所有有效的动态注册和静态注册的BroadcastReceiver按照priority属性值从大到小排序,对于具有相同的priority的动态广播和静态广播,动态广播会排在前面。

       2>先接收的BroadcastReceiver可以对此有序广播进行截断,使后面的BroadcastReceiver不再接收到此广播,也可以对广播进行修改,使后面的BroadcastReceiver接收到广播后解析得到错误的参数值。当然,一般情况下,不建议对有序广播进行此类操作,尤其是针对系统中的有序广播。

       4)Sticky Broadcast:粘性广播(在 android 5.0/api 中deprecated,不再推荐使用,相应的还有粘性有序广播,同样已经deprecated)。

       æ—¢ç„¶å·²ç»deprecated,此处不再多做总结。

       5)Local Broadcast:App应用内广播(此处的App应用以App应用进程为界)

       ç”±å‰æ–‡é˜è¿°å¯çŸ¥ï¼ŒAndroid中的广播可以跨进程甚至跨App直接通信,且注册是exported对于有intent-filter的情况下默认值是true,由此将可能出现安全隐患如下:

       1.其他App可能会针对性的发出与当前App intent-filter相匹配的广播,由此导致当前App不断接收到广播并处理;

       2.其他App可以注册与当前App一致的intent-filter用于接收广播,获取广播具体信息。

       æ— è®ºå“ªç§æƒ…形,这些安全隐患都确实是存在的。由此,最常见的增加安全性的方案是:

       1.对于同一App内部发送和接收广播,将exported属性人为设置成false,使得非本App内部发出的此广播不被接收;

       2.在广播发送和接收时,都增加上相应的permission,用于权限验证;

       3.发送广播时,指定特定广播接收器所在的包名,具体是通过intent.setPackage(packageName)指定在,这样此广播将只会发送到此包中的App内与之相匹配的有效广播接收器中。

       App应用内广播可以理解成一种局部广播的形式,广播的发送者和接收者都同属于一个App。实际的业务需求中,App应用内广播确实可能需要用到。同时,之所以使用应用内广播时,而不是使用全局广播的形式,更多的考虑到的是Android广播机制中的安全性问题。

       ç›¸æ¯”于全局广播,App应用内广播优势体现在:

       1.安全性更高;

       2.更加高效。

       ä¸ºæ­¤ï¼ŒAndroid v4兼容包中给出了封装好的LocalBroadcastManager类,用于统一处理App应用内的广播问题,使用方式上与通常的全局广播几乎相同,只是注册/取消注册广播接收器和发送广播时将主调context变成了LocalBroadcastManager的单一实例。

       ä»£ç ç‰‡æ®µå¦‚下:

       1 //registerReceiver(mBroadcastReceiver, intentFilter);

        2 //注册应用内广播接收器

        3 localBroadcastManager = LocalBroadcastManager.getInstance(this);

        4 localBroadcastManager.registerReceiver(mBroadcastReceiver, intentFilter);

        5        

        6 //unregisterReceiver(mBroadcastReceiver);

        7 //取消注册应用内广播接收器

        8 localBroadcastManager.unregisterReceiver(mBroadcastReceiver);

        9

        Intent intent = new Intent();

        intent.setAction(BROADCAST_ACTION);

        intent.putExtra("name", "qqyumidi");

        //sendBroadcast(intent);

        //发送应用内广播

        localBroadcastManager.sendBroadcast(intent);

        

       4.不同注册方式的广播接收器回调onReceive(context, intent)中的context具体类型

       1).对于静态注册的ContextReceiver,回调onReceive(context, intent)中的context具体指的是ReceiverRestrictedContext;

       2).对于全局广播的动态注册的ContextReceiver,回调onReceive(context, intent)中的context具体指的是Activity Context;

       3).对于通过LocalBroadcastManager动态注册的ContextReceiver,回调onReceive(context, intent)中的context具体指的是Application Context。

       æ³¨ï¼šå¯¹äºŽLocalBroadcastManager方式发送的应用内广播,只能通过LocalBroadcastManager动态注册的ContextReceiver才有可能接收到(静态注册或其他方式动态注册的ContextReceiver是接收不到的)。

        

       5.不同Android API版本中广播机制相关API重要变迁

       1).Android5.0/API level 开始粘滞广播和有序粘滞广播过期,以后不再建议使用;

       2).”静态注册的广播接收器即使app已经退出,主要有相应的广播发出,依然可以接收到,但此种描述自Android 3.1开始有可能不再成立“

       Android 3.1开始系统在Intent与广播相关的flag增加了参数,分别是FLAG_INCLUDE_STOPPED_PACKAGES和FLAG_EXCLUDE_STOPPED_PACKAGES。

       FLAG_INCLUDE_STOPPED_PACKAGES:包含已经停止的包(停止:即包所在的进程已经退出)

       FLAG_EXCLUDE_STOPPED_PACKAGES:不包含已经停止的包

       ä¸»è¦åŽŸå› å¦‚下:

       è‡ªAndroid3.1开始,系统本身则增加了对所有app当前是否处于运行状态的跟踪。在发送广播时,不管是什么广播类型,系统默认直接增加了值为FLAG_EXCLUDE_STOPPED_PACKAGES的flag,导致即使是静态注册的广播接收器,对于其所在进程已经退出的app,同样无法接收到广播。

       è¯¦æƒ…参加Android官方文档:/about/versions/android-3.1.html#launchcontrols

       ç”±æ­¤ï¼Œå¯¹äºŽç³»ç»Ÿå¹¿æ’­ï¼Œç”±äºŽæ˜¯ç³»ç»Ÿå†…部直接发出,无法更改此intent flag值,因此,3.1开始对于静态注册的接收系统广播的BroadcastReceiver,如果App进程已经退出,将不能接收到广播。

       ä½†æ˜¯å¯¹äºŽè‡ªå®šä¹‰çš„广播,可以通过复写此flag为FLAG_INCLUDE_STOPPED_PACKAGES,使得静态注册的BroadcastReceiver,即使所在App进程已经退出,也能能接收到广播,并会启动应用进程,但此时的BroadcastReceiver是重新新建的。

       1 Intent intent = new Intent();

       2 intent.setAction(BROADCAST_ACTION);

       3 intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);

       4 intent.putExtra("name", "qqyumidi");

       5 sendBroadcast(intent);

       æ³¨1:对于动态注册类型的BroadcastReceiver,由于此注册和取消注册实在其他组件(如Activity)中进行,因此,不受此改变影响。

       æ³¨2:在3.1以前,相信不少app可能通过静态注册方式监听各种系统广播,以此进行一些业务上的处理(如即时app已经退出,仍然能接收到,可以启动service等..),3.1后,静态注册接受广播方式的改变,将直接导致此类方案不再可行。于是,通过将Service与App本身设置成不同的进程已经成为实现此类需求的可行替代方案。

copyright © 2016 powered by 皮皮网   sitemap