android 學習隨筆十六(廣播 )

1、廣播接收者

  • BroadcastReceiver
  • 接收系統發出的廣播
  • 現實中的廣播:電臺為了傳達一些消息,而發送的廣播,通過廣播攜帶要傳達的消息,群眾只要買一個收音機,就可以收到廣播了
  • ?Android中的廣播:系統在運行過程中,會發生很多事件,系統為了讓其他應用知道系統發生了這個事件,會發送一個對應該事件的廣播,比如:電量改變、收到短信、撥打電話、屏幕解鎖、系統開機,應用只要注冊一個廣播接收者,就可以接收到系統發出的廣播

2、定義方式

  • 定義一個類繼承BroadcastReceiver
  • package com.ecollab.ipdialor;import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;public class CallReceiver extends BroadcastReceiver {//收到廣播時調用
        @Overridepublic void onReceive(Context context, Intent intent) {//取出廣播中的號碼String number = getResultData();String newNumber = "17951" + number;//把修改后的號碼放入廣播中
            setResultData(newNumber);}
    }
    View Code
  • 在清單文件中配置該類,指定接收的廣播種類?

<receiver android:name="com.ecollab.ipdialer.CallReceiver">
<intent-filter >
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>

  • <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.ecollab.ipdialor"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="14"android:targetSdkVersion="21" /><uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".MainActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><receiver android:name="com.ecollab.ipdialor.CallReceiver"><intent-filter><action android:name="android.intent.action.NEW_OUTGOING_CALL" /></intent-filter></receiver></application></manifest>
    View Code
  • 廣播是通過intent發送的,intent中會攜帶一個action,系統會在所有清單文件中尋找,看哪一個廣播接收者的intent-filter和廣播中的intent是匹配的,那么這個廣播接收者就會收到這條廣播

3、IP撥號器

  • 系統撥打號碼時,會發出一個廣播,廣播中會攜帶撥打的號碼,注冊廣播接收者接收這個廣播,取出這個號碼,修改這個號碼,然后把修改后的號碼重新放入廣播
  • 廣播接收者所在進程即便沒有啟動,廣播發送出來時,系統也會啟動這個進程,然后把廣播交給廣播接收者
  • 接收打電話廣播需要權限?<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>

4、短信攔截器

  • 系統收到短信時會產生一條廣播,廣播中包含了短信的號碼和內容
  • 設置廣播接收者的優先級,大于系統短信應用,先一步收到短信廣播,然后攔截廣播,短信應用收不到廣播,用戶就看不到短信了
  • 定義廣播接收者接收短信廣播(所有系統廣播里怎么發數據我們自己建的應用就怎么取數據

    public void onReceive(Context context, Intent intent) {
    //拿到系統廣播里攜帶的短信內容
    Bundle bundle = intent.getExtras();
    Object[] objects = (Object[]) bundle.get("pdus");
    for(Object ob : objects ){
    //通過object對象創建一個短信對象
    SmsMessage sms = SmsMessage.createFromPdu((byte[])ob);

?

if("13888".equals(sms.getOriginatingAddress()))

{

abortBroadcast();//攔截短信

}

System.out.println(sms.getMessageBody());
System.out.println(sms.getOriginatingAddress());
}
}

  • 系統創建廣播時,把短信存放到一個數組,然后把數據以pdus為key存入bundle,再把bundle存入intent。攔截后的短信再發給系統短信應用
  • 清單文件中配置廣播接收者接收的廣播類型,注意要設置優先級屬性(-1000至1000),要保證優先級高于短信應用,才可以實現攔截

<receiver android:name="com.itheima.smslistener.SmsReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>

  • 添加權限?<uses-permission android:name="android.permission.RECEIVE_SMS"/>
  • 4.0之后,進程需要啟動過一次,廣播接收者才能生效
  • 4.0之后,用戶手動停止進程,那么廣播接收者再也不會啟動了,直到用戶下一次手動啟動進程

?5、監聽SD卡狀態

  • 清單文件中定義廣播接收者接收的類型,監聽SD卡常見的三種狀態,所以廣播接收者需要接收三種廣播

<receiver android:name="com.itheima.sdcradlistener.SDCardReceiver">
<intent-filter >
<action android:name="android.intent.action.MEDIA_MOUNTED"/>
<action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
<action android:name="android.intent.action.MEDIA_REMOVED"/>
<data android:scheme="file"/>
</intent-filter>
</receiver>

  • 廣播接收者的定義(不用switch對比字符串)

public class SDCardReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// 區分接收到的是哪個廣播
String action = intent.getAction();

if(action.equals("android.intent.action.MEDIA_MOUNTED")){
System.out.println("sd卡就緒");
}
else if(action.equals("android.intent.action.MEDIA_UNMOUNTED")){
System.out.println("sd卡被移除");
}
else if(action.equals("android.intent.action.MEDIA_REMOVED")){
System.out.println("sd卡被拔出");
}
}
}

6、勒索軟件(流氓軟件)

?接收開機廣播,在廣播接收者中啟動勒索的Activity(開機啟動

  • 清單文件中配置接收開機廣播

<receiver android:name="com.itheima.lesuo.BootReceiver">
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>

  • 權限

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

  • 定義廣播接收者

@Override
public void onReceive(Context context, Intent intent) {
//開機的時候就啟動勒索軟件
Intent it = new Intent(context, MainActivity.class);

//it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(it);
}

    1. 以上代碼還不能啟動MainActivity,因為廣播接收者的啟動,并不會創建任務棧,那么沒有任務棧,就無法啟動activity
    2. 手動設置創建新任務棧的flag。?it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

7、監聽應用的安裝、卸載、更新

應用在安裝卸載更新時,系統會發送廣播,廣播里會攜帶應用的包名

  • 清單文件定義廣播接收者接收的類型,因為要監聽應用的三個動作,所以需要接收三種廣播

<receiver android:name="com.itheima.app.AppReceiver">
<intent-filter >
<action android:name="android.intent.action.PACKAGE_ADDED"/>
<action android:name="android.intent.action.PACKAGE_REPLACED"/>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package"/>
</intent-filter>
</receiver>

  • 廣播接收者的定義

public void onReceive(Context context, Intent intent) {
//區分接收到的是哪種廣播
String action = intent.getAction();
//獲取廣播中包含的應用包名
Uri uri = intent.getData();
if(action.equals("android.intent.action.PACKAGE_ADDED")){
System.out.println(uri + "被安裝了");
}
else if(action.equals("android.intent.action.PACKAGE_REPLACED")){
System.out.println(uri + "被更新了");
}
else if(action.equals("android.intent.action.PACKAGE_REMOVED")){
System.out.println(uri + "被卸載了");
}
}

8、發送自定義廣播

Intent intent = new Intent();
intent.setAction("ecollab.ui.web");
sendBroadcast(intent);

接收跟系統廣播相同。

9、廣播的兩種類型

  • 無序廣播:所有跟廣播的intent匹配的廣播接收者都可以收到該廣播,并且是沒有先后順序(同時收到)
  • 有序廣播:所有跟廣播的intent匹配的廣播接收者都可以收到該廣播,但是會按照廣播接收者的優先級來決定接收的先后順序:發送方法為sendOrderedBroadcast
  • 優先級的定義:-1000~1000
  • 結果接收者:所有廣播接收者都接收到廣播之后,它才接收,并且一定會接收

//resultReceiver在所有廣播接收者收到廣播后,才會收到。(定義內部接收者類,無需在清單文件中注冊)

sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)

?

class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {

}
}

sendOrderedBroadcast(intent, null, new?MyReceiver(),null,0,"廣播內容",null);

?

  • abortBroadCast:阻止其他接收者接收這條廣播,類似攔截,只有有序廣播可以被攔截

?

轉載于:https://www.cnblogs.com/ecollab/p/5909979.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457890.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457890.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457890.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

驅動面試題總結

1、字符型驅動設備你是怎么創建設備文件的&#xff0c;就是/dev/下面的設備文件&#xff0c;供上層應用程序打開使用的文件&#xff1f; 答&#xff1a;mknod命令結合設備的主設備號和次設備號&#xff0c;可創建一個設備文件。 評&#xff1a;這只是其中一種方式&#xff0…

python程序寫詩_將Python詩歌與D結合起來

在與docker一起使用poetry時&#xff0c;需要記住以下幾點。 安裝 安裝poetry的正式方法是通過&#xff1a;curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python 這種方式允許poetry及其依賴項與依賴項分離。但是&#xff0c;在我看來…

Azure運維系列 4:安裝和使用Azure PowerShell管理云

前面講到了很多的管理方式&#xff0c;包括Azure中國最近更新的預覽版管理門戶和Azure云助理&#xff0c;都是非常不錯的管理Azure的方式&#xff0c;今天我們再來介紹一種更加高效的管理方式Azure PowerShell。熟悉命令行的朋友都知道&#xff0c;Linux之所以那么好用是因為其…

[轉]char * 和字符數組

[轉]char * 和字符數組 原文地址&#xff1a;http://www.cnblogs.com/jeakon/archive/2012/05/27/2816809.html 代碼中的int * i就是我們關注的焦點。它是一個指向int指針。也就是說&#xff1a;i指向一個內存地址&#xff0c;從這個地址開始存儲了一個數據。int * i中的int標明…

設備模型1

作為開頭篇&#xff0c;我不想寫HELLLOWORLD驅動&#xff0c;甚至字符設備驅動的開發&#xff0c;這樣文章充斥在各大網站上的博客上&#xff0c;隨便搜搜&#xff0c;就可以找到幾百篇。這是最基本的東西&#xff0c;通過這些內容的學習&#xff0c;我們要掌握LINUX驅動的基本…

如何使用Android Studio把自己的Android library分享到jCenter和Maven Central

第一部分&#xff1a;在bintray上創建package首先&#xff0c;你需要在bintray上創建一個package。為此&#xff0c;你需要一個bintray賬號&#xff0c;并在網站上創建一個package。第一步&#xff1a;在bintray.com上注冊一個賬號。&#xff08;注冊過程很簡單&#xff0c;自己…

python2編碼_Python2字符編碼

我們通常見到的字符串編碼主要是三種GB2312/GBK、Unicode、UTF-8。GB2312/GBK是多字節(multibytes)編碼的一種&#xff0c;屬于“ASCII的加強版”&#xff0c;與之平行的由Big5、ShiftJIS之類的編碼各自為政&#xff0c;所有這些用兩個字節表示漢字的多字節編碼標準統稱為ANSI編…

angularJs關于指令的一些冷門屬性

我們使用ng的時候&#xff0c;經常會使用到指令&#xff0c;大家所熟知的屬性我在這里就不介紹了&#xff0c;講講大家沒怎么留意的屬性 1.multiElement 這是指定指令作用區間的功能&#xff0c;最常用的就是ng-repeat-start和ng-repeat-end了。 2.priority 指令優先級&#xf…

設備模型2

前言 在上一篇中&#xff0c;我們大致描述了LINUX設備模型&#xff0c;我們先來總結一下三要素的關系。 從圖中可以看出,Linux設備模型就是"總線、設備、驅動、類"這四個概念之前的相互關系;這也是Linux2.6內核抽象出來的用于管理系統中所有設備的模型圖; 簡單地描述…

angular自定義指令詳解

指令&#xff08;directive&#xff09;是angular里面最核心也是最難懂的東西&#xff0c;在慕課網看了下大漠窮秋老濕的視頻&#xff0c;自己百度半天做了一些小test&#xff0c;總算把一切都搞明白了。 先列出學習來源&#xff1a; 指令中controller和link的區別&#xff1a;…

delphi7aes加密解密與java互轉_跨語言(java vs python vs nodejs)的RSA加解密問題探討

多次被問到這樣的問題&#xff1a;java服務端的rsa加密操作已經完成&#xff0c;返回一個16進制的字符串給python平臺&#xff0c;但是在python進行私鑰解密的時候發現行不通。。。。前端python加密&#xff0c;后端用java解密&#xff0c;解不出來還有諸如nodejs從理論上來說&…

類的定義、成員定義修飾符

類的定義 修飾符含義1無或internal 只能在當前項目中訪問類&#xff0c;其它項目引用后也無法訪問2public 可以任何地方訪問類3abstract 不能實例化&#xff0c;只能供繼承之用4sealed 不能供派生之用&#xff0c;只能實例化5internal abstract136public abstract237intern…

設備模型3

在上一篇分析中&#xff0c;多次提到了SYSFS&#xff0c;這是個什么東西&#xff1f;這可是個很大的TOPIC&#xff0c;關于它的講述可以寫本書&#xff0c;但是我們暫時的目標不是要完全啃投它所有的東西&#xff0c;沒時間&#xff0c;沒精力&#xff0c;我們只要掌握我們需要…

浪潮之巔讀后感

這幾天看到一本非常好的書《浪潮之巔》。浪潮&#xff0c;指的是時代的大潮。而浪潮之巔&#xff0c;顧名思義就是指站在時代潮流的巔峰&#xff0c;引領時代潮流&#xff0c;扛起發展大旗。而本書就是在介紹各大處在浪潮之巔的IT公司的歷史及發展。 書中有句話說得好&#xff…

利用dft的定義計算dft的matlab程序_CP2K教程系列之靜態計算(Pymatflow篇)

本系列CP2K教程是《CP2K菜根譚》的升級版&#xff0c;在舊版基礎上添加了如何結合Pymatflow工具簡化計算流程的內容。話不多說&#xff0c;本文將為您帶來CP2K系列教程中的靜態計算部分。靜態計算設置靜態計算是大多數人接觸第一性原理計算后第一次運行的計算類型。很多其它類型…

機器學習:最大似然估計與最大后驗概率估計

在機器學習領域&#xff0c;概率估計是經常用到的一種模型&#xff0c;而概率估計中&#xff0c;我們經常會看到兩種估計模型&#xff0c;一種是最大似然估計&#xff0c;即 Maximum likelihood&#xff0c; 另外一種就是最大后驗概率估計&#xff0c;即 Maximum posterior &am…

ubuntu14.04安裝git

參考教程&#xff1a;git介紹&#xff1a;安裝&#xff0c;使用&#xff0c;創建分支 安裝的方法有兩種&#xff0c;一種直接是通過ubuntu的APT安裝&#xff0c;這種方法最簡便&#xff0c;缺點是版本可能不是最新的。所有還有另一種方法是下載源碼進行安裝&#xff0c;這種能…

微軟是如何戲耍程序員們的

2019獨角獸企業重金招聘Python工程師標準>>> 別用微軟的東西。商業目的性太強&#xff0c;千萬別被微軟牽著鼻子走&#xff0c;血淋淋的教訓。微軟推出的垃圾多了去了。它什么都想做&#xff0c;很多都沒做好&#xff1a; MFC&#xff1a;Win31時代出生&#xff0c;…

3d立體相冊特效html網頁代碼_新聞類網頁正文通用抽取器

項目起源開發這個項目&#xff0c;源自于我在知網發現了一篇關于自動化抽取新聞類網站正文的算法論文——《基于文本及符號密度的網頁正文提取方法》這篇論文中描述的算法看起來簡潔清晰&#xff0c;并且符合邏輯。但由于論文中只講了算法原理&#xff0c;并沒有具體的語言實現…

ubuntu14.04安裝 R16 Tina Linux SDK

第一步&#xff1a;由于是14.04系統所以這樣$sudo -i $cd /etc/apt/sources.list.d $echo "deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse" > ia32-libs-raring.list $apt-get update $apt-get install ia32-libs $r…