源码解析 registerReceiver 时序图 代码讲解 我们跟着上面时序图来讲解代码 先在 MainActivity registerReceiver 广播接收者 public class MainActivity...registerReceiver(new ReceiverB(),filterB); } ...代码省略... } 点击 registerReceiver 我们发现并不是...getReceivcerDispatcher 函数中,首先看下 r 是不是已经实例化了,如果没有就创建一个,并且以 r 为 key 值保存在一个 HM 集合中,而这个 map 又被存储在了 mReceivers...保存到了一个 ReceiverList 中,这个列表的宿主进程是 rl.app,就是 MainActivity 所在的进程。...{ if (DEBUG_BROADCAST) Slog.v( TAG_BROADCAST, "Received BROADCAST_INTENT_MSG"); //处理下一个广播 processNextBroadcast
前者称为动态注册,后者静态 动态注册监听时间变化 新建一个类让他继承自BroadcastReceiver,并重写父类的onReceiver()方法。...静态注册实现开机启动 右击com.example.broadcasttest包->new->Other->Broadcast Receiver,新建 package com.example.broadcastreceiver...所以强制下线的逻辑并不是在MainActivity中写,而应该写在接收这条广播的BroadcastReceiver里,这样强制下线的功能就不会依附于任何界面 静态注册的BroadcastReceiver...="android.intent.category.LAUNCHER" /> 将主Activity设置为LoginActivity,而不是...MainActivity,这样打开应用时就是先打开登录界面
在分析之前,我们先来看一下MainActivity是如何调用registerReceiver函数来注册广播接收器的: public class MainActivity extends Activity...MainActivity是继承于Context类的,因此,这里用Context类型来引用。...) { return mIIntentReceiver; } } ...... } 在LoadedApk.getReceiverDispatcher函数中,首先看一下参数r是不是已经有相应的...在ReceiverDispatcher类的构造函数中,还会把传进来的Handle类型的参数activityThread保存下来,以便后面在分发广播的时候使用。...(), rl); } 这里其实就是把广播接收器receiver保存一个ReceiverList列表中,这个列表的宿主进程是rl.app,这里就是MainActivity所在的进程了,在ActivityManagerService
A 其实主要原因是我这边做智能设备的,原来的App程序与硬件交互也都是整一个App下的Module实现,但是每一类的设备,可能对接的硬件不是完全一样,考虑想用单独的Service进程统一管理,App中只做业务逻辑的部分...所以这里增加了一个NotificationUtil的类,将通知这里做了一个简单的封装,方便两边同时调用。...MainActivity代码 class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding...= Intent() broadcast.action = "MESSAGE_ACTION" broadcast.putExtra("MESSAGE_ID...= Intent() broadcast.action = "MESSAGE_ACTION" broadcast.putExtra("MESSAGE_ID
--监听BROADCAST" />--> receiver android:name=".MyBroadcastReceiver" android...true"> BROADCAST...{ Intent intent = new Intent( "com.example.broadcasttest.MY_BROADCAST...--监听BROADCAST" />--> <!
"); //第一个参数是intent,第二个是接收的权限 MainActivity.this.sendOrderedBroadcast..."> receiver> receiver android:name=".FourReceiver...MainActivity.java case R.id.sendSticky: Intent intentSticky = new...Intent("com.wuyinlei.action.MY_BROADCAST_STICKY"); MainActivity.this.sendStickyBroadcast...android:name="android.intent.category.DEFAULT"/> 立即获取电量,而不是等电量变化的广播
BroadcastReceiver(包含启动的Intent系统已经创建的) 继承BroadcastReceiver类而且重写onReceive()方法 注冊广播接收者 静态注冊(配置文件)或者动态注冊...registerReceiver是android.content.ContextWrapper类中的方法,Activity和Service都继承了ContextWrapper,所以能够直接调用。...这样的注冊方式与静态注冊相反,不是常驻型的。也就是说广播会尾随程序的生命周期。...也是android.content.ContextWrapper类中的方法,它能够将一个指定地址和參数信息的Intent对象以广播的形式发送出去。...而不是等电量变化的广播,比方当阅读软件打开时马上显示出电池电量。
实际上,Activity,Service和Broadcast Receiver这三种核心组件都需要使用Intent来激活。...Receiver 在Intent对象中应该包含如下信息: Component name(组件名称):组件名称通过setComponent(),setClass(),setClassName()设置,通过...Intent类中定义了一系列动作常量,包括Activity和Broadcast两类。...在标准广播动作中,通常使用registerRecevier()或者在配置文件中的receiver>标签。Intent对象中的动作使用setAction()设置,使用getAction()读取。...所有这些都定义在Intent类中。
发布的两种方式是无序方式(普通广播)和有序方式(有序广播) 订阅的两种方式是静态订阅和动态订阅 发布的两种方式 无序方式(普通广播) Intent intent = new Intent("cn.psvmc.broadcast..."/> receiver> 有序的这样写 receiver android:name=".MyBroadcastReceiver">...上面提到了显式Intent和隐式Intent,他们的区别一会在说 public class MainActivity extends Activity { private BroadcastReceiver...显式Intent & 隐式Intent 显式Intent Intent it = new Intent(MainActivity.this,SecondActivity.class); startActivity...系统在收到短信的时候,会发送一个:android.provider.Telephony.SMS_RECEIVED这样的广播,而且这是一个有序的广播,所以我们就可以拦截了这条短信,因为系统中的短信接收者的订阅优先级不是
一、两种Broadcast: · 普通广播(Normal Broadcast):用sendBroadcast()方法发送。 ...· 有序广播(Ordered Broadcast):用sendOrderedBroadcast()方法发送。 ...另外,接受者可以将处理结果存入数据(可通过setResultExtras(Bundle)方法将数据存入Broadcast),当做Broadcast再传递给下一级接收者(可通过代码Bundle bundle...短信拦截原理:系统收到短信,发出的Broadcast属于有序广播,程序就可以通过设定优先级先接收到通知,然后终止传递。...> 3.最后在MainActivity中发送广播 1 public class MainActivity extends Activity { 2 3 Button btn_send_receiver
代码如下: public class MainActivity extends AppCompatActivity { private Button mSendBroadcast;...sendBroadcast():发送Normal Broadcast。 Ordered Broadcast(有序广播):接收者按预先声明的优先级依次接收Broadcast。...Ordered Broadcast接收者可以调用abortBroadcast()方法终止Broadcast Intent的传播,一旦终止,后面的接收者就无法接收到Broadcast。...sendOrderedBroadcast():发送Ordered Broadcast。...上面发送广播中举了一个发送普通广播的例子,这里再举一个发送有序分广播的例子: 该程序的Activity界面只有一个按钮,用于发送一条有序广播,代码如下: public class MainActivity
今天客户邮件过来一段代码让我加一下,说是用暗码启动MainActivity。...android:scheme="android_secret_code"/> 因为之前改过Dialer,定制过相关的暗码功能,所以没多想就直接把intent-filter加在MainActivity...后来一想,好像哪里不太一样,Telephony.SECRET_CODE 好像是系统定义的,不是定制的。...sendDialerSpecialCode(secretCode); } else { // System service call is not supported pre-O, so must use a broadcast...中间 receiver android:name="com.xx.receiver.SecretCodeReceiver"> <action android:name
注册BroadcastReceiver接收广播 继承BroadcastReceiver 这是一个抽象类,public abstract class BroadcastReceiver { 实现抽象方法...public class MainActivity extends Activity { private MyBroadcastReceiver receiver ; @Override...} } 这里abortBroadcast()拦截了有序广播,不是说每人能再收到广播了么?为什么ZhiFuReceiver 还能收到广播呢?...= LocalBroadcastManager.getInstance(MainActivity.this); localBroadcastManager.registerReceiver...bundle_data", bundle); //使用LocalBroadcastManager发送广播 LocalBroadcastManager.getInstance(MainActivity.this
(Broadcast Receiver) 广播的类型分为 标准广播与有序广播。...其实只需要创建一个类,让他继承Broadcast-Receiver,并重写onReceive()方法即可。当有广播到来时,onReceive方法就会执行。具体的逻辑就可以在这个方法中处理。...首先,新建一个ActivityCollector类作为活动管理器,代码如下。...然后创建BaseActity类作为所有活动的父类,代码如下 public class BaseActivity extends AppCompatActivity { protected void...也就是说,强制下线的功能并不是写在MainActivity里的,而是应该写在接收这条广播的广播接收器里面,这样强制用户下线的功能就不会依附于任何界面,不管是在程序的任何地方,只需要发出这样一条广播,可以完成强制下线的操作了
Broadcast是什么 广播的特性 广播(Broadcast)用于Android组件之间的灵活通信,它与Activity和Service的区别在于: 1、Activity和Service都只能一对一地通信...静态注册,指的是在AndroidManifest.xml中注册receiver接收器,receiver节点与activity和service节点是平级关系;它的生命周期开始于系统启动,结束于系统关机,在系统运行过程中...它与静态注册的区别在于:静态注册的receiver代码是单独的java文件,而嵌套注册的receiver代码是嵌入在某个java类中,所以注册时要在receiver类名前加上“属主类名$”。...另外,嵌套注册的receiver类在定义时也要加上static标记,这样才能正常访问。...null) { String guest = intent.getStringExtra("guest"); Toast.makeText(MainActivity.this
application节点包含了Activity、Service、Content Provider和Broadcast Receiver等子节点。...(指定类名时,可以使用“.”作为简写方式代替应用程序的包名)如下代码: 1 <activity 2 android:name="com.codingblock.manifesttest.MainActivity...:通过添加receiver标签,可以注册一个Broadcast Receiver,而不用事先启动应用程序。...通过在manifest中注册一个Broadcast Receiver,可以使这个进程实现完全自治。...如果一个匹配的Intent被广播了,则应用程序就会自动启动,并且你注册的Broadcast Receiver也会开始执行。
广播接收者,broadcast receiver,安卓系统在使用时会产生很多的事件,比如:短信到来,电量低,拨打电话等等 界面布局,线性布局,EditText指定为电话号码,设置属性android:inputType...putString(key,value)方法,存入数据 调用Editor对象的commit()方法,提交 调用sp对象的getString(name,defValue)方法,获取到存入的数据 新建一个类OutRecevier...继承 BroadcastReceiver 在清单文件中进行配置 添加Receiver/>节点,设置名称属性android:name=”.OutReceiver” 设置意图过滤器添加节点<intent-filter...import android.view.MenuItem; import android.view.View; import android.widget.EditText; public class MainActivity...string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity
"/> receiver> 第二种:在代码中动态注册,如下: MyReceiver receiver = new MyReceiver... 三、启动一个BroadcastReceiver BroadcastReceiver用于接收程序(包括用户开发的程序和程序内建的系统)所发出的Broadcast Intent,启动一个BroadcastReceiver...第二步:调用Context的sendBroadcast()方法或sendOrderedBroadcast()方法来启动Intent; 当一个Broadcast Intent被发出后,所有匹配该Intent...的Receiver都有可能被启动。 ...Intent intent = new Intent(MainActivity.this, MyReceiver.class); sendBroadcast(intent); 在代码中动态注册的Receiver
在 AndroidManifest.xml 文件中注册的 Activity、service 和 broadcast receiver 组件如果有 intent-filter 声明都必须显式申明是否需要对外披露服务...这个 Service 一般是通过直接或者间接继承 MediaBrowserServiceCompat 来实现的,如果不是,就没有必要设置这个。..." 因为无论是否设定 exported,系统都会向 receiver 发送对应的广播。...下面的 Activity 默认会 exported: MainActivity"> broadcast receiver
先创建一个发送广播的应用: public class MainActivity extends Activity { @Override protected void onCreate...action,用于接收者介绍 intent.setAction("com.demo.broadcastReceiver"); //设置广播的数据 intent.putExtra("broadcast...method stub //得到广播的数据 Bundle data = intent.getExtras(); String broadString = data.getString("broadcast...; //显示 Toast.makeText(context, broadString, 0).show(); } } 记得此广播接受者必须要清单文件中配置: receiver... receiver
领取专属 10元无门槛券
手把手带您无忧上云