編輯:Android編程入門
廣播接收器用於響應來之其他應用程序或者系統的廣播消息。這些消息有時被稱為事件或者意圖。例如,應用程序可以初始化廣播來讓其他的應用程序指導一些數據已經被下載到設備,並可以為他們所用。這樣廣播接收器可以定義適當的動作來攔截這些通信。
有以下兩個重要的步驟來使系統的廣播意圖配合廣播接收器工作。
還有一個附加的步驟,要實現自定義的意圖,你必須創建並廣播這些意圖。
廣播接收器需要實現為BroadcastReceiver類的子類,並重寫onReceive()方法來接收以Intent對象為參數的消息。
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Intent Detected.", Toast.LENGTH_LONG).show();
}
}
應用程序通過在AndroidManifest.xml中注冊廣播接收器來監聽制定的廣播意圖。假設我們將要注冊MyReceiver來監聽系統產生的ACTION_BOOT_COMPLETED事件。該事件由Android系統的啟動進程完成時發出。

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED">
</action>
</intent-filter>
</receiver>
</application>
現在,無論什麼時候Android設備被啟動,都將被廣播接收器MyReceiver所攔截,並且在onReceive()中實現的邏輯將被執行。
有許多系統產生的事件被定義為類Intent中的靜態常量值。下面的表格列舉了重要的系統事件。
如果你想要應用程序中生成並發送自定義意圖,你需要在活動類中通過sendBroadcast()來創建並發送這些意圖。如果你使用sendStickyBroadcast(Intent)方法,則意圖是持久的(sticky),這意味者你發出的意圖在廣播完成後一直保持著。
public void broadcastIntent(View view)
{
Intent intent = new Intent();
intent.setAction("cn.uprogrammer.CUSTOM_INTENT");
sendBroadcast(intent);
}
cn.uprogrammer.CUSTOM_INTENT的意圖可以像之前我們注冊系統產生的意圖一樣被注冊。
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="cn.uprogrammer.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
這個實例將解釋如何創建廣播接收器來攔截自定義意圖。一旦你熟悉自定義意圖,你可以為應用程序編程來攔截系統產生的意圖。讓我們按照下面的步驟來修改Hello World實例章節中我們創建的Android應用程序。
下面是修改的主要活動文件src/cn.uprogrammer.broadcastreceiver/MainActivity.java的內容。這個文件包含了每個基礎的生命周期方法。我們添加了broadcastIntent()方法來廣播自定義事件。
package cn.uprogrammer.broadcastreceiver;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.content.Intent;
import android.view.View;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
// 廣播自定義意圖
public void broadcastIntent(View view){
Intent intent = new Intent();
intent.setAction("cn.programmer.CUSTOM_INTENT");
sendBroadcast(intent);
}
}
下面是src/cn.uprogrammer.broadcastreceiver/MyReceiver.java的內容:
package cn.uprogrammer.broadcastreceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "檢測到意圖。", Toast.LENGTH_LONG).show();
}
}
接下來修改AndroidManifest.xml文件。這裡通過添加<receiver.../>標簽來包含我們的廣播接收器:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.uprogrammer.broadcastreceiver"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name="MyReceiver">
<intent-filter>
<action android:name="cn.programmer.CUSTOM_INTENT">
</action>
</intent-filter>
</receiver>
</application>
</manifest>
下面是res/layout/activity_main.xml文件的內容,包含廣播自定義意圖的按鈕。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="廣播實例"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:textSize="30dp" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="www.uprogrammer.cn"
android:textColor="#ff87ff09"
android:textSize="30dp"
android:layout_above="@+id/imageButton"
android:layout_centerHorizontal="true"
android:layout_marginBottom="40dp" />
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageButton"
android:src="@drawable/ic_launcher"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="廣播意圖"
android:onClick="broadcastIntent"
android:layout_below="@+id/imageButton"
android:layout_centerHorizontal="true" />
</RelativeLayout>
下面是res/values/strings.xml文件的內容,定義了兩個新的常量。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Android Broadcast Receiver</string>
<string name="action_settings">Settings</string>
<string name="menu_settings">Settings</string>
<string name="title_activity_main">Main Activity</string>
</resources>
讓我們運行剛剛修改的Hello World!應用程序。我假設你已經在安裝環境時創建了AVD。打開你的項目中的活動文件,點擊工具欄中的
圖標來在Android Studio中運行應用程序。Android Studio在AVD上安裝應用程序並啟動它。如果一切順利,將在模擬器窗口上顯示如下:

現在點擊"廣播意圖"按鈕來廣播我們的自定義意圖。這將廣播我們的自定義意圖"cn.programmer.CUSTOM_INTENT",在我們注冊的廣播接收器MyReceiver中攔截並執行我們實現的邏輯。模擬器的底部將出現toast。如下:

你可以嘗試實現其他的廣播接收器來攔截系統產生的意圖,如系統啟動,日期改變和低電量等。
android-自定義控件之液位指示器
由於安卓應用很廣泛,在工業中也常有一些應用,比如可以用安卓來去工業中的一些數據進行實現的監測,顯示,同時可以做一些自動化控制,當然在這裡,我不是做這些自動化控制方面的研究
Android消息機制
每一個Android應用在啟動的時候都會創建一個線程,這個線程被稱為主線程或者UI線程,Android應用的所有操作默認都會運行在這個線程中。但是當我們想要進行數據請求,
破解android手機圖形鎖
安卓手機的圖形鎖包括3*3,4*4,5*5的點陣,按次序連接數個點從而達到鎖定/解鎖的功能。以3*3為例,最少需要連接4個點,最多
Android UI基礎之五大布局
Android UI基礎之五大布局 Android的界面是有布局和組件協同完成的,布局好比是建築裡的框架,而組件則相當於建築裡的磚瓦。組件按照布局