1. 程式人生 > >android的廣播和意圖intent

android的廣播和意圖intent

一、廣播

A、廣播的作用

在Android中,Broadcast是一種廣泛運用的在應用程式之間傳輸資訊的機制。我們拿廣播電臺來做個比方。我們平

常使用收音機收音是這樣的:許許多多不同的廣播電臺通過特定的頻率來發送他們的內容,而我們使用者只需要將頻率調成

和廣播電臺的一樣就可以收聽他們的內容了。Android中的廣播機制就和這個差不多的道理。

其具體作用就是傳輸資訊:實現了不同的程式之間的資料傳輸與共享,因為只要是和傳送廣播的action相同的接受

者都能接受這個廣播。典型的應用就是android自帶的簡訊,電話等等廣播,只要我們實現了他們的action的廣播,那麼

我們就能接收他們的資料了,以便做出一些處

理。比如說攔截系統簡訊,攔截騷擾電話等等。

B、廣播接收者和廣播發送者

廣播接收者:

廣播接收者簡單地說就是接收廣播意圖的Java類,此Java類繼承BroadcastReceiver類,重寫:
public void onReceive(Context context,Intent intent)方法,其中intent可以獲得傳遞的資料,如

String content =intent.getStringExtra("name");

同時也需要在清單檔案配置receiver (四大元件都需要在清單檔案中配置):註冊為廣播接收者

<receiver android:name="com.intent.receivebroadcast.ReceiveCustomReceive">
            <intent-filter >
                <action android:name="com.intent.custombroadcast"/>
            </intent-filter>
        </receiver>
 

廣播發送者

通常廣播發送方就是呼叫Context.sendBroadcast()的程式,而廣播接收者就是繼承BroadcastReceiver的程式;

而廣播發送分為有序廣播和無序廣播:

無序廣播:類似與新聞聯播,幾乎同時到達多個被設定的廣播接收者處,而且不能修改intent傳遞的資料,也不能終止

廣播的傳播。

例子:廣播發送者的程式碼:

package com.itent.sendbroadcase;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;


public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	public void click(View v) {
		Intent intent = new Intent();
		//設定action
		intent.setAction("com.intent.custombroadcast");//配置為接收者的清單檔案的receiver
		intent.putExtra("name", "新聞聯播七點開播");
		sendBroadcast(intent);
	}
}

廣播接收者的程式碼:
package com.intent.receivebroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class ReceiveCustomReceive extends BroadcastReceiver {
	//當我傳送自定義廣播時,這個方法會接收到
	
	public void onReceive(Context context, Intent intent) {
		
		//1,取出我們傳送廣播攜帶的資料
		String content =intent.getStringExtra("name");
		//2,把資料展示到吐司上面
		Toast.makeText(context, content, 0).show();	
	}
}
配置的清單檔案:
 </activity>
        
        <receiver android:name="com.intent.receivebroadcast.ReceiveCustomReceive">
            <intent-filter >
                <action android:name="com.intent.custombroadcast"/>
            </intent-filter>
        </receiver>

有序廣播:

廣播接收者需要提前設定優先順序,優先順序高的先接收到廣播,優先順序數值為-1000~1000,在AndroidManifest.

ml的<intent-filter android:priority="xxx">設定int值(-1000到1000);比如存在3個廣播接收者A、B、C,優先順序A>B>C,因此A最先收到廣播,

當A收到廣播後,可以向廣播中新增一些資料給下一個接收者(intent.putExtra()),或者終止廣播(abortBroadcast());

Context.sendOrderedBroadcast(intent);

例子:習大大給農民發1000斤大米,各級行政依次往下廣播訊息(設定優先順序),如果各級政府貪汙,

修改大米數量(setResultData/intent.putExtra())。或者某一級行政直接全部貪汙(終止廣播(abortBroadcast()))。例子:

廣播發送者:

package com.itent.sendrice;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	//定義一個button發生廣播
	public void click(View v){
		//傳送一條有序廣播
		Intent intent = new Intent();
		//設定一個action
		intent.setAction("com.itent.rice");
		//resultReceiver:最終的接收廣播,不需要配置
		//sendOrderedBroadcast(intent, receiverPermission, 廣播接收者, 排程器, 起始碼, 資料, 起始額外資料);
		sendOrderedBroadcast(intent, null, new FinalReceive(), null, 1, "習大大給每個村民發了一千斤大米", null);
	}
}
定義一個最終的廣播接收者,不需要再清單檔案配置。
package com.itent.sendrice;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class FinalReceive extends BroadcastReceiver {

	@Override
	//最終的receiver 不需要在清單檔案裡配置
	public void onReceive(Context context, Intent intent) {
		
		String content = getResultData();
		
		Toast.makeText(context, "報告習大大"+content, 1).show();
	}

}
廣播接收者:

省長優先接收:程式碼如下

package com.itent.receiverice;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class provienceReceive extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		//1,獲取發生廣播攜帶的資料
		String content = getResultData();
		//2,展示到吐司
		Toast.makeText(context, "省長說:"+content, 0).show();
		//3終止廣播(全部貪了)
		//abortBroadcast();
		
		//3,修改資料(扣留大米)
		setResultData("習大大給每個村民發了500斤大米");
	}

}
市長第二級接收廣播,程式碼如下
package com.itent.receiverice;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class CityReceive extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// 1,獲取發生廣播攜帶的資料
		String content = getResultData();
		// 2,展示到吐司
		Toast.makeText(context, "市長說:" + content, 0).show();
		// 3,修改資料(扣留大米)
		setResultData("習大大給每個村民發了200斤大米");
	}
}

鄉長第三級接收廣播,程式碼如下:
package com.itent.receiverice;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class CountryReceive extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// 1,獲取發生廣播攜帶的資料
		String content = getResultData();
		// 2,展示到吐司
		Toast.makeText(context, "鄉長說:" + content, 0).show();
		// 3,修改資料(扣留大米)
		setResultData("習大大給每個村民發了10斤大米");
	}

}

農民第四級接收廣播,不做修改(農民能得到多少是多少唄)程式碼如下
package com.itent.receiverice;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class NongMinReceive extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// 1,獲取發生廣播攜帶的資料
		String content = getResultData();
		// 2,展示到吐司
		Toast.makeText(context, "農民說:" + content, 0).show();
		
	}

}
設定了優先順序,需要在清單檔案中配置如下:
 <!-- 配置廣播接收者 -->
        <receiver android:name="com.itent.receiverice.provienceReceive">
            <intent-filter 
                android:priority="1000">
                <action android:name="com.itent.rice"/>
            </intent-filter>
        </receiver>
        
         <receiver android:name="com.itent.receiverice.CityReceive">
            <intent-filter 
                android:priority="800">
                <action android:name="com.itent.rice"/>
            </intent-filter>
        </receiver>
        
          <receiver android:name="com.itent.receiverice.CountryReceive">
            <intent-filter 
                android:priority="100">
                <action android:name="com.itent.rice"/>
            </intent-filter>
        </receiver>
        
           <receiver android:name="com.itent.receiverice.NongMinReceive">
            <intent-filter 
                android:priority="10">
                <action android:name="com.itent.rice"/>
            </intent-filter>
        </receiver>

吐司結果順序如下:

省長說:習大大給每個村民發了一千斤大米(先吐司再修改的,修改為500斤)

市長說:習大大給每個村民發了500斤大米 (被省長修改資料,修改為200斤)

鄉長說:習大大給每個村民發了200斤大米 (被市長修改資料,修改為10斤)

農民說:習大大給每個村民發了10斤大米 (最後能得到10斤大米)

FinalReceive:最終的廣播接收者再所有之後進行:

報告習大大:習大大給每個村民發了10斤大米 (反饋最終訊息給習大大)。

二、意圖intent
Intent對Android的核心和靈魂,是各元件之間的橋樑。四大元件分別為Activity 、Service、BroadcastReceiver、

ContentProvider。四大元件是獨立的,它們之間可以相互呼叫、協調工作,組成一個真正的應用,intent是應用的關鍵。

它也是一種標識,如標識Activity為一個程式的開始:<action android:name="android.intent.action.MAIN" />

也是負責對應用中一次操作的動作、動作涉及資料、附加資料進行描述,Android則根據此Intent的描述,負責找到對應

的元件,將 Intent傳遞給呼叫的元件,並完成元件的呼叫。

意圖可以分為顯示意圖和隱式意圖:

顯示意圖:呼叫Intent.setComponent()或Intent.setClass()方法明確指定了元件名得Intent為顯式意圖,顯式意圖明確指定

了Intent應該傳遞給那個元件。

   如:Intent intent = new Intent();  
 
        intent.setAction(Activity1.this,Activity2.class);   
        startActivity(intent);   
僅僅只要二部完成。

隱式意圖:沒有明確指定元件名得Intent為隱式意圖。android系統會根據隱式意圖中設定的動作(action)、

類別(category)、資料(URI和資料型別)找到最合適的元件來處理這個意圖。 

如呼叫電話撥號:Intent intent = new Intent();  
 
                  intent.setAction("android.intent.action.CALL");  
 
                  intent.setData("Uri.parse("tel:") + mobile");//mobile為電話號碼(是數字)   
                  startActivity(intent);  
 
而電話撥號器在定義的時候,必須在清單檔案中定義intent-filter意圖過濾器。如下:
  <Intent-filter>   
        <action android:name="android.intent.action.CALL"/>   
        <category android:name"android.intent.category.DEFAULT"/>   
        <data android:scheme="tel"/>   
    </Intent-filter>
隱式意圖在自定義的時候要設定action(動作)、category(型別)或者type(資料型別)如:
// 點選按鈕跳轉到TestActivty
	public void click2(View v) {
		// [1]建立意圖物件
		Intent intent = new Intent();
		// [2]設定意圖的action(動作)
		intent.setAction("com.intent.testactivity");
		// [3]設定一個category
		intent.addCategory("android.intent.category.DEFAULT");

		// [3.2]設定資料型別 type 這個方法會自動清除通過setdata方法設定的資料
		// intent.setType("aa/bb");

		// [3.1]設定一個data
		intent.setData(Uri.parse("intent:" + 119));

		// ☆☆☆☆☆注意 如果type 和 data同時使用的時候 應該用這個方法
		// intent.setDataAndType(Uri.parse("itheima1:"+119), "aa/bb1");

		// [4]開啟activity 
		startActivity(intent);
	}

而清單檔案也要進行如下配置:
<activity
            android:name=".TestActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="com.intent.testactivity" />
                <data android:scheme="intent"/>
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

在意圖過濾器中可以有多個動作和類別,但意圖只能定義一個動作,所以只要定義的這個動作(action)和意圖過濾器中

的任意一個匹配就可以成功。類別(category)也是,只要匹配其中一個就行,不必匹配所有。但是,如果定義的類別在

意圖過濾器中找不到,就會報錯,也就是說意圖中定義的動作和意圖在過濾器中必須有。


而二者區別:

一般顯示意圖比隱身意圖更加安全,因為他沒有定義入口,不能其他應用呼叫。

隱式意圖只要指定了意圖過濾器,其他應用就可以使用。

總結:瞭解廣播的兩種傳送方式,記得配置清單檔案。意圖intent是4大元件的橋樑,讓四大元件配合協調工作。

相關推薦

android廣播意圖intent

一、廣播 A、廣播的作用 在Android中,Broadcast是一種廣泛運用的在應用程式之間傳輸資訊的機制。我們拿廣播電臺來做個比方。我們平 常使用收音機收音是這樣的:許許多多不同的廣播電臺通過特定的頻率來發送他們的內容,而我們使用者只需要將頻率調成 和廣播電臺的一樣就可

Android 顯式意圖(Intent) 與 隱式意圖

意圖型別 Android 支援兩種型別的意圖(Intent)。 顯式 Intent:通過元件名指定啟動的目標元件,比如 startActivity(new Intent(A.this,B.class)); 每次啟動的元件只有一個。 隱式顯式Intent:不指定具體

Android 訊息傳遞之IntentIntentFilter的匹配規則

1.Intent概述及作用 Intent 是一個訊息傳遞物件,您可以使用它從其他應用元件請求操作。 詳見官方文件 主要功能如下: 啟動Activity: 通過將 Intent 傳遞給 startActivity(),您可以啟動新的 Activity 例項。I

Android 廣播大全 Intent Action 事件

Intent.ACTION_AIRPLANE_MODE_CHANGED; //關閉或開啟飛航模式時的廣播 Intent.ACTION_BATTERY_CHANGED; //充電狀態,或者電池的電量發生變化 //電池的充電狀態、電荷級別改變,不能通過組建宣告接收這

Android 監聽簡訊(同時監聽廣播資料庫)

暗釦,強烈譴責這種侵害使用者利益的行為。。。 下面給大家介紹Android暗釦原理.......  Android4.4以下的系統玩遊戲就要小心了哈 暗釦方式之一:簡訊訂購,即監聽--------攔截------------處理簡訊。 暗釦方式之二:模擬人為操作(又叫模擬流

Android資料傳遞】Intent傳遞ListObjectList(附原始碼)

一、傳遞List 傳遞List<String>的方法 ArrayList<String> info = new ArrayList<String>(); info.add(name); info.add(website); inf

Android傳送接收UDP廣播

要實現在Android平臺上發UDP廣播,可能需要先了解一下什麼是廣播地址 廣播地址 廣播地址(Broadcast Address)是專門用於同時向網路中所有工作站進行傳送的一個地址。在使用TCP/IP協議的網路中,主機標識端host ID 為全1的IP

Android(一) activity、intent知識總結

導讀: 第一部分,基礎activity知識 第二部分,Intent傳遞值 第三部分,Intent傳遞類物件 Activity 1.建立Activity的注意點

Android監聽系統廣播 自定義廣播遇到的問題

現在有一個專案需要做一個開機自啟動的功能,這個怎麼實現呢?一頓咔咔咔百度,發現很多推薦 使用監聽系統開機廣播BOOT_COMPLETED,CONNECTIVITY_CHANGE 來實現。那好吧  我也這麼來做。先寫一個RootReceiver  extends Broadc

android 靜態廣播動態廣播的區別用法

一、什麼是廣播 BroadcastReceiver是android 系統的四大元件之一,本質上就是一個全域性的監聽器,用於監聽系統全域性的廣播訊息,可以方便的實現系統中不同元件之間的通訊。 程式可以通過呼叫context的sendBroadcast()方法來啟動指定的Br

Android ActivityIntent機制學習筆記

Activity Android中,Activity是所有程式的根本,所有程式的流程都執行在Activity之中,Activity具有自己的生命週期(見http://www.cnblogs.com/feisky/archive/2010/01/01/1637427.ht

Android如何監聽開機廣播關機廣播

專案背景:在錄影過程中,遇到關機事件,想要監聽關機操作,從而停止錄影,退出程式。 一、監聽開機廣播 Android系統啟動完成後會發出啟動完成廣播(android.intent.action.BOOT_COMPLETED),所有註冊了接收啟動完成廣播的接收器(Broadca

(第一行程式碼筆記系列-廣播1)android 廣播動態註冊靜態註冊有什麼區別及基本用法

新建一個BroadcastTest專案,然後修改MainActivity中的程式碼,如下所示: public class MainActivity extends Activity { private IntentFilter intentFilter; private NetworkChange

《網絡編程》廣播多播

多個 配置過程 client 數據報 一個 term 所在 總結 網上 概述 主機可採用的通信方式有例如以下三種: 單播:單臺主機與單臺主機之間的數據通信;廣播:單臺主機向網絡中全部主機發送數據報的過程;多播:單臺主機向選定的一組主機發送數據報的過程;

Android JNINDK學習(09)--JNI實例二 傳遞類對象

get state 回調 obj utf 說明 called [] code 1 應用層代碼 NdkParam.java是JNI函數的調用類,它的代碼如下: package com.skywang.ndk; import android.app.Activity;

Android基礎】利用Intent在Activity之間傳遞數據

一次 there center ack and block for success display 前言: 上一篇文章給大家聊了Intent的使用方法。怎樣用Intent啟動Activity和隱式Intent。這一篇文章給大家聊聊怎樣利用Intent在Activit

Android ListView ScrollView 沖突問題

相同 ·· 設置 info 博客 new 結果 試驗 方法 近期做一款APP,當中有一個類似微博的評論功能的界面,先是列出微博的正文內容和圖片等。然後下邊是評論。一開始就想著用一個ScrollView把主要內容和評論區的ListView包起來。然後加入各個控件的內容就可

Android ActivityFragment的生命周期圖

sso mar popu data con b2c post pos alt Android Activity和Fragment的生命周期圖

Android GalleryImageSwitcher同步自動(滾動)播放圖片庫

rate 存在 contex ams isa called 遍歷 urn mage 本文主要內容是如何讓Gallery和ImageSwitcher控件能夠同步自動播放圖片集 ,看起來較難,然而,實現的方法非常簡單, 請跟我慢慢來。總的來說,本文要實現的效果如下圖:(截圖效

Android Notification權限機制探討

程序執行效率 except hit nes 數組 sdk default 耐心 lean 近期為了在部門內做一次小型的技術分享。深入了解了一下Notification的實現原理。以及android的權限機制。在此做個記錄。文章可能比較長,沒耐心的話就直接看題綱吧。