安卓常见系统广播
安卓的四大组件

安卓的四⼤组件Android四⼤基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver⼴播接收器。
⼀:了解四⼤基本组件Activity :应⽤程序中,⼀个Activity通常就是⼀个单独的屏幕,它上⾯可以显⽰⼀些控件也可以监听并处理⽤户的事件做出响应。
Activity之间通过Intent进⾏通信。
在Intent 的描述结构中,有两个最重要的部分:动作和动作对应的数据。
典型的动作类型有:M AIN(activity的门户)、VIEW、PICK、EDIT 等。
⽽动作对应的数据则以URI 的形式进⾏表⽰。
例如:要查看⼀个⼈的联系⽅式,你需要创建⼀个动作类型为VIEW 的intent,以及⼀个表⽰这个⼈的URI。
与之有关系的⼀个类叫IntentFilter。
相对于intent 是⼀个有效的做某事的请求,⼀个intentfilter 则⽤于描述⼀个activity(或者IntentReceiver)能够操作哪些intent。
⼀个activity 如果要显⽰⼀个⼈的联系⽅式时,需要声明⼀个IntentFilter,这个IntentFilter 要知道怎么去处理VIEW 动作和表⽰⼀个⼈的URI。
IntentFilter 需要在AndroidManifest.xml 中定义。
通过解析各种intent,从⼀个屏幕导航到另⼀个屏幕是很简单的。
当向前导航时,activity 将会调⽤startActivity(Intent myIntent)⽅法。
然后,系统会在所有安装的应⽤程序中定义的IntentFilter 中查找,找到最匹配myIntent 的Intent 对应的activity。
新的activity 接收到myIntent 的通知后,开始运⾏。
当startActivity ⽅法被调⽤将触发解析myIntent 的动作,这个机制提供了两个关键好处:A、Activities 能够重复利⽤从其它组件中以Intent 的形式产⽣的⼀个请求;B、Activities 可以在任何时候被⼀个具有相同IntentFilter 的新的Activity 取代。
Android中的广播(BroadCast)详细介绍

Android中的⼴播(BroadCast)详细介绍什么是⼴播在Android中,Broadcast是⼀种⼴泛运⽤的在应⽤程序之间传输信息的机制。
我们拿⼴播电台来做个⽐⽅。
我们平常使⽤收⾳机收⾳是这样的:许许多多不同的⼴播电台通过特定的频率来发送他们的内容,⽽我们⽤户只需要将频率调成和⼴播电台的⼀样就可以收听他们的内容了。
Android中的⼴播机制就和这个差不多的道理。
电台发送的内容是语⾳,⽽在Android中我们要发送的⼴播内容是⼀个Intent。
这个Intent中可以携带我们要传送的数据。
电台通过⼤功率的发射器发送内容,⽽在Android中则是通过sendBroadcast这个⽅法来发送(很形象的名字吧)。
⽤户通过调整到具体的电台频率接受电台的内容。
⽽在Android中要接受⼴播中的内容则是通过注册⼀个BroadCastReceiver 来接收的。
只有发送⼴播的action和接收⼴播的action相同,接受者才能接受这个⼴播。
⼴播有什么⽤其实,在什么是⼴播的第⼀句就已经说明了⼴播有什么⽤了。
对了,笼统⼀点讲就是⽤来传输数据的。
具体⼀点说就是:1.实现了不同的程序之间的数据传输与共享,因为只要是和发送⼴播的action相同的接受者都能接受这个⼴播。
典型的应⽤就是android⾃带的短信,电话等等⼴播,只要我们实现了他们的action的⼴播,那么我们就能接收他们的数据了,以便做出⼀些处理。
⽐如说拦截系统短信,拦截骚扰电话等等 2.起到了⼀个通知的作⽤,⽐如在service中要通知主程序,更新主程序的UI等。
因为service是没有界⾯的,所以不能直接获得主程序中的控件,这样我们就只能在主程序中实现⼀个⼴播接受者专门⽤来接受service发过来的数据和通知了。
实现⼴播现在我们就来实现⼀个简单的⼴播程序。
Android提供了两种注册⼴播接受者的形式,分别是在程序中动态注册和在xml中指定。
他们之间的区别就是作⽤的范围不同,程序动态注册的接收者只在程序运⾏过程中有效,⽽在xml注册的接收者不管你的程序有没有启动有会起作⽤。
android广播分类

android广 播 分 类
安卓广播分为两类: 1.普通广播, broadcast,广播发出之后所有满足条件的应用都能获取到广播里面的数据,缺点是应用获取广播中的数据修改之后不能传递给 其它接收广播的应用; 2.有序广播,orderbroadcast,广播发出之后各应用根据应用的优先级依次接收广播,优先级高的应用接收广播之后修改的数据也可以传递给 后来的接受者,优先级高的应用也可以调用abrotbroascast方法停止该广播的向下传播,优先级靠应用的android:prioioty属性控制,该值的 取值区间为-1000到1000,值越大优先级越高。
Байду номын сангаас
Android总结篇系列:Android广播机制

1.Android广播机制概述Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver 指的就是广播接收者(广播接收器)。
广播作为Android组件间的通信方式,可以使用的场景如下:1.同一app内部的同一组件内的消息通信(单个或多个线程之间);2.同一app内部的不同组件之间的消息通信(单个进程);3.同一app具有多个进程的不同组件之间的消息通信;4.不同app之间的组件之间消息通信;5.Android系统在特定情况下与App之间的消息通信。
从实现原理看上,Android中的广播使用了观察者模式,基于消息的发布/订阅事件模型。
因此,从实现的角度来看,Android中的广播将广播的发送者和接受者极大程度上解耦,使得系统能够方便集成,更易扩展。
具体实现流程要点粗略概括如下:1.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册;2.广播发送者通过binder机制向AMS发送广播;3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中;4.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。
对于不同的广播类型,以及不同的BroadcastReceiver注册方式,具体实现上会有不同。
但总体流程大致如上。
由此看来,广播发送者和广播接收者分别属于观察者模式中的消息发布和订阅两端,AMS 属于中间的处理中心。
广播发送者和广播接收者的执行是异步的,发出去的广播不会关心有无接收者接收,也不确定接收者到底是何时才能接收到。
显然,整体流程与EventBus非常类似。
在上文说列举的广播机制具体可以使用的场景中,现分析实际应用中的适用性:第一种情形:同一app内部的同一组件内的消息通信(单个或多个线程之间),实际应用中肯定是不会用到广播机制的(虽然可以用),无论是使用扩展变量作用域、基于接口的回调还是Handler-post/Handler-Message等方式,都可以直接处理此类问题,若适用广播机制,显然有些“杀鸡牛刀”的感觉,会显太“重”;第二种情形:同一app内部的不同组件之间的消息通信(单个进程),对于此类需求,在有些教复杂的情况下单纯的依靠基于接口的回调等方式不好处理,此时可以直接使用EventBus等,相对而言,EventBus由于是针对统一进程,用于处理此类需求非常适合,且轻松解耦。
android broadcast原理

android broadcast原理
AndroidBroadcast原理是指Android系统中用于应用程序之间通信的一种机制。
它可以让一个应用程序向所有其他应用程序广播一个消息,其他应用程序可以注册一个BroadcastReceiver(广播接收器)来接收该消息。
因此,Broadcast机制是一种非常重要的跨应用程序通信方式。
在Android系统中,一个Broadcast消息由一个Intent对象表示,它包含了要广播的消息以及相关的信息。
当一个应用程序发送一个Broadcast时,Android系统会将该消息发送给所有已注册相应IntentFilter的BroadcastReceiver。
BroadcastReceiver可以通过Intent对象中的信息来判断是否需要处理该消息,并进行相应的处理。
Android系统中有两种广播方式:普通广播和有序广播。
普通广播是一种异步广播方式,即发送者不会等待接收者的响应,而是直接发送广播。
这种广播方式的优点是速度快,但是也存在一些缺点,如接收者无法阻止其他应用程序的广播或在广播处理过程中进行拦截
和修改。
有序广播是一种同步广播方式,即发送者等待接收者的响应,每个接收者在处理完广播后,可以选择继续将广播传递给下一个接收者或者终止广播。
这种广播方式的优点是安全性高,但是也存在一些缺点,如速度比较慢。
Broadcast机制在Android系统中被广泛应用,例如在系统事件、应用程序之间的通信、插件等方面。
掌握Broadcast原理对于Android
开发人员来说是非常重要的。
android广播的用法

android广播的用法
Android广播是一种用于在应用程序中发送和接收消息的机制。
广播是一种机制,应用程序可以发送广播消息,而其他应用程序可以注册并接收这些广播消息,并根据需要采取相应的操作。
Android广播有两个主要组成部分:广播发送者和广播接收者。
广播发送者:
1. 创建Intent对象,设置广播的标识(Action)和需要传递的
数据(Extras)。
2. 调用广播发送函数sendBroadcast()、sendOrderedBroadcast()
或sendStickyBroadcast()来发送广播。
广播接收者:
1. 创建一个继承自BroadcastReceiver的广播接收器类。
2. 在AndroidManifest.xml文件中注册广播接收器,设置接收
的广播标识(Action)。
3. 重写广播接收器的onReceive()方法,根据接收到的广播进
行相应的处理。
常见的广播使用场景有:
1. 系统广播:例如设备启动、网络状态变化、电量变化等系统事件的广播。
2. 自定义广播:应用程序内部发送自定义的广播,用于不同组件间的通信。
3. 动态注册广播接收器:在代码中动态注册广播接收器,用于灵活地监听特定的广播事件。
4. 静态注册广播接收器:在AndroidManifest.xml文件中静态注册广播接收器,用于在应用程序安装后自动接收广播。
总之,Android广播是一种强大的通信机制,可以用于应用程序内部的组件间通信,以及与系统和其他应用程序的交互。
android系统的分区概念

前面我们提到了android系统的分区概念,下面我们来讲一下后面将要遇到的一些名词,以便在后续操作的时候不会出现太多的问号!1、hboot(SPL) 这里指的是手机上的启动模块,通俗的说,就是负责手机启动引导的一段程序,类似于电脑主板上的BIOS,都是负责底层操作的。
和在电脑上刷新BIOS一样,刷错了,电脑就会开不了机,对手机来说也一样,这部分的内容刷错了,手机就会变砖!2、radio:这里指的是手机上的通讯模块,又叫做基带。
负责手机的无线信号,蓝牙,WIFI等设备的管理,也就是说,相当于电脑系统里面的硬件驱动部分。
这样说或许也不是特别的准确,大家明白大概的意思就可以了。
通常我们所说的刷radio,刷基带,就是指的刷写这一部分,以便解决通话质量、网络连接质量、蓝牙连接等等问题。
3、recovery:字面意思是恢复,手机上的一个功能分区,有点类似于笔记本电脑上的恢复分区。
一般大厂出的笔记本,都会自带一个特殊分区,里面保存着系统的镜像文件,当系统出问题的时候,我们可以通过它来一键恢复系统。
这里的recovery功能有些类似。
其实,他更像是电脑上的小型winPE系统,可以允许我们通过启动到winPE系统上,去做一些备份、恢复的工作。
当然,系统自带的recovery基本没用,所以我们通常会刷入一个第三方的recovery,以便实现更多的功能,例如:备份系统,恢复系统,刷新系统等。
但官方自带的recovery 也不是一无是处,在使用OTA方式升级系统时候,会检查此分区内容,如果不是原厂自带的,OTA升级就会失败。
4、fastboot:字面意思是快速启动,在这里,其实是一个特殊的工程模式,通过fastboot界面,连接电脑后,我们可以在电脑端通过特殊的指令来操作手机,例如更新radio,就可以通过fastboot来完成。
fastboot的级别又要比recovery来的要高一些,可以完成更底层的一些操作。
后面我们会结合实际,来讲解一些fastboot的用法,更详细的资料,大家可以通过网络来学习,这里不再赘述。
系出名门Android(4) - 活动(Activity), 服务(Service), 广播(Broadcast), 广播接收器(BroadcastReceiv)

摘自:/topic/577479介绍在Android 中使用Activity, Service, Broadcast, BroadcastReceiver活动(Activity) - 用于表现功能服务(Service) - 相当于后台运行的Activity广播(Broadcast) - 用于发送广播广播接收器(BroadcastReceiver) - 用于接收广播Intent - 用于连接以上各个组件,并在其间传递消息1、演示Activity 的基本用法,一个Activity 启动另一个Activity,启动另一个Activity 时为其传递参数,被启动的Activity 返回参数给启动者的Activity运行结果:代码:<?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/txt"android:layout_width="fill_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/btn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="启动另一个Activity"/></LinearLayout><?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/txt"android:layout_width="fill_parent"android:layout_height="wrap_content"/><Buttonandroid:id="@+id/btn"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>package com.lgl;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.TextView;public class Main extends Activity {TextView txt;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(yout.main);txt = (TextView) this.findViewById(R.id.txt);txt.setText("Activity 1");Button btn = (Button) this.findViewById(R.id.btn);btn.setText("启动另一个Activity");btn.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {// 实例化 Intent,指定需要启动的 ActivityIntent intent = new Intent();intent.setClass(Main.this, MyActivity.class);// 实例化 Bundle,设置需要传递的参数Bundle bundle = new Bundle();bundle.putString("name", "webabcd");bundle.putDouble("salary", 100.13);// 将需要传递的参数赋值给 Intent 对象intent.putExtras(bundle);// startActivity(intent); // 启动指定的 Intent(不等待返回结果)// Main.this.finish();// 启动指定的 Intent,并等待返回结果// 其中第二个参数如果大于等于零,则返回结果时会回调onActivityResult() 方法startActivityForResult(intent, 0);}});Log.d("MyDebug", "onCreate");}// 被启动的 Activity 返回结果时的回调函数@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (resultCode == Activity.RESULT_OK) {Bundle bundle = data.getExtras();String name = bundle.getString("name");double salary = bundle.getDouble("salary");txt.setText("Activity 1" + "\n名字:" + name + "\n薪水:"+ String.valueOf(salary));}}@Overrideprotected void onStart() {super.onStart();Log.d("MyDebug", "onStart");}@Overrideprotected void onStop() {super.onStop();Log.d("MyDebug", "onStop");}@Overrideprotected void onRestart() {super.onRestart();Log.d("MyDebug", "onRestart");}@Overrideprotected void onPause() {super.onPause();Log.d("MyDebug", "onPause");}@Overrideprotected void onResume() {super.onResume();Log.d("MyDebug", "onResume");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d("MyDebug", "onDestroy");}package com.lgl;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.TextView;//被另一个 Activity 所启动的 Activitypublic class MyActivity extends Activity {Intent intent;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.setContentView(yout.main2);// 获取启动者传递过来的参数intent = this.getIntent();Bundle bundle = intent.getExtras();String name = bundle.getString("name");double salary = bundle.getDouble("salary");TextView txt = (TextView) this.findViewById(R.id.txt);txt.setText("Activity 2" + "\n名字:" + name + "\n薪水:"+ String.valueOf(salary));Button btn = (Button) this.findViewById(R.id.btn);btn.setText("返回前一个Activity");btn.setOnClickListener(new Button.OnClickListener() {public void onClick(View v) {// 返回参数给启动者Intent intent = new Intent(MyActivity.this, Main.class);startActivity(intent);MyActivity.this.finish();}});}}2、Service, Broadcast, BroadcastReceive r 的演示代码:<?xml version="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><TextViewandroid:id="@+id/txtMsg"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/hello"/><Buttonandroid:text="btnStart"android:id="@+id/btnStart"android:layout_width="wrap_content"android:layout_height="wrap_content"> </Button><Buttonandroid:text="btnStop"android:id="@+id/btnStop"android:layout_width="wrap_content"android:layout_height="wrap_content"> </Button><Buttonandroid:text="btnBind"android:id="@+id/btnBind"android:layout_width="wrap_content"android:layout_height="wrap_content"> </Button><Buttonandroid:text="btnUnbind"android:id="@+id/btnUnbind"android:layout_width="wrap_content"android:layout_height="wrap_content"> </Button></LinearLayout>package com.lgl;import android.app.Activity;import android.content.BroadcastReceiver; import ponentName; import android.content.Context;import android.content.Intent;import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.Bundle;import android.os.IBinder;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;public class Main extends Activity implements OnClickListener { private TextView txtMsg;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);setTitle("android 之 service");this.findViewById(R.id.btnStart).setOnClickListener(this);this.findViewById(R.id.btnStop).setOnClickListener(this);this.findViewById(R.id.btnBind).setOnClickListener(this);this.findViewById(R.id.btnUnbind).setOnClickListener(this);txtMsg = (TextView) this.findViewById(R.id.txtMsg);// 实例化自定义的 BroadcastReceiverreceiver = new UpdateReceiver();IntentFilter filter = new IntentFilter();// 为 BroadcastReceiver 指定 action ,使之用于接收同 action 的广播filter.addAction("com.webabcd.service.msg");// 以编程方式注册 BroadcastReceiver 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android常用系统广播
常用:
Android广播接实现短信的监听
Action :android.provider.Telephony.SMS_RECEIVED
对应权限<uses-permission android:name="android.permission.RECEIVE_SMS">
</uses-permission> Android广播接实现电话的监听
1:需要在AndroidManifest.xml清单中添加权限
<uses-permissionandroid:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
2:注册广播要注意事件的级别(android中的级别-1000~1000)
<receiver android:name=".PhoneBroadcastReceiver">
<intent-filter android:priority="1000">
<actionandroid:name="android.intent.action.NEW_OUTGOING_CALL"/>
<actionandroid:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
屏幕操作相关:
//重启设备时的广播
Intent.ACTION_REBOOT;
//屏幕被关闭之后的广播
Intent.ACTION_SCREEN_OFF;
//屏幕被打开之后的广播
Intent.ACTION_SCREEN_ON;
//在系统启动完成后,这个动作被广播一次(只有一次)。
Intent.ACTION_BOOT_COMPLETED;
//当用户按下电源按钮,长按或短按(不管有没跳出话框),进行锁屏时,android系统都会广播此Action消息
Intent.ACTION_CLOSE_SYSTEM_DIALOGS;
电池相关:
//表示电池电量低
Intent.ACTION_BATTERY_LOW;
//表示电池电量充足,即从电池电量低变化到饱满时会发出广播
Intent.ACTION_BATTERY_OKAY;
存储相关:
//设备内存不足时发出的广播,此广播只能由系统使用,其它APP不可用
Intent.ACTION_DEVICE_STORAGE_LOW;
//设备内存从不足到充足时发出的广播,此广播只能由系统使用,其它APP不可用
Intent.ACTION_DEVICE_STORAGE_OK;
//未正确移除SD卡(正确移除SD卡的方法:设置--SD卡和设备内存--卸载SD卡),但已把SD 卡取出来时发出的广播,扩展介质(扩展卡)已经从SD 卡插槽拔出,但是挂载点(mount point) 还没解除(unmount)
Intent.ACTION_MEDIA_BAD_REMOVAL;
//插入外部储存装置,比如SD卡时,系统会检验SD卡,此时发出的广播
Intent.ACTION_MEDIA_CHECKING;
//已拔掉外部大容量储存设备发出的广播(比如SD卡,或移动硬盘),不管有没有正确卸载都会发出此广播, 用户想要移除扩展介质(拔掉扩展卡)。
Intent.ACTION_MEDIA_EJECT;
//插入SD卡并且已正确安装(识别)时发出的广播, 扩展介质被插入,而且已经被挂载。
Intent.ACTION_MEDIA_MOUNTED;
//拓展介质存在,但使用不兼容FS(或为空)的路径安装点检查介质包含在Intent.mData领域。
Intent.ACTION_MEDIA_NOFS;
//外部储存设备已被移除,不管有没正确卸载,都会发出此广播,扩展介质被移除。
Intent.ACTION_MEDIA_REMOVED;
程序安装或者卸载相关:
//一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)Intent.ACTION_PACKAGE_ADDED;
//一个已存在的应用程序包已经改变,包括包名
Intent.ACTION_PACKAGE_CHANGED;
//触发一个下载并且完成安装时发出的广播,比如在电子市场里下载应用?
Intent.ACTION_PACKAGE_INSTALL;
//成功的删除某个APK之后发出的广播, 包括包名(正在被安装程序不能接收到这个广播)Intent.ACTION_PACKAGE_REMOVED;
//替换一个现有的安装包时发出的广播
Intent.ACTION_PACKAGE_REPLACED;
其他:
//在耳机口上插入耳机时发出的广播
Intent.ACTION_HEADSET_PLUG;
//插上外部电源时发出的广播
Intent.ACTION_POWER_CONNECTED;
//设备当前设置被改变时发出的广播(包括的改变:界面语言,设备方向,等,请参考Configuration.java)
Intent.ACTION_CONFIGURATION_CHANGED;
//关闭或打开飞行模式时的广播
Intent.ACTION_AIRPLANE_M;
//飞行模式发生改变时的广播
Intent.ACTION_AIRPLANE_MODE_CHANGED;
//设备日期发生改变时会发出此广播
Intent.ACTION_DATE_CHANGED;
//改变输入法时发出的广播
Intent.ACTION_INPUT_METHOD_CHANGED;
//已断开外部电源连接时发出的广播
Intent.ACTION_POWER_DISCONNECTED;
//时间被设置时发出的广播
Intent.ACTION_TIME_CHANGED;
//广播:当前时间已经变化(正常的时间流逝),当前时间改变,每分钟都发送,不能通过组件声明来接收,只有通过Context.registerReceiver()方法来注册
Intent.ACTION_TIME_TICK;
//设备墙纸已改变时发出的广播
Intent.ACTION_WALLPAPER_CHANGED;。