編輯:關於Android編程
1、BroadCastReceiver:廣播接收者
Android中:系統在運行過程中,會產生會多事件,那麼某些事件產生時,比如:電量改變、收發短信、撥打電話、屏幕解鎖、開機,系統會發送廣播,只要應用程序接收到這條廣播,就知道系統發生了相應的事件,從而執行相應的代碼。使用廣播接收者,就可以收聽廣播。
創建BroadCastReceiver 廣播接收者:
第一步: 創建一個java類 繼承extends broadcastreceiver; ( android.content.BroadcastReceiver)
第二步:配置清單文件: 在清單文件中定義recevier節點,定義name屬性,指定廣播接收者java類的全類名。
在intent-filter的節點中,指定action子節點,action的值必須跟要接受的廣播中的action匹配,比如,如果要接受打電話廣播,
那麼action的值必須指定為 intent 意圖對象。 打電話 New_OUTGOING_CALL;
因為打電話廣播中所包含的action,就是”android.intent.action.NEW_OUTGOING_CALL”,所以我們定義廣播接收者時,
action必須與其匹配,才能收到這條廣播
4、設置權限;
即便廣播接收者所在進程已經被關閉,當系統發出的廣播中的action跟該廣播接收者的action匹配時,系統會啟動該廣播接收者所在的進程,
並把廣播發給該廣播接收者
demo1 :
定義一個類繼承廣播接收者,在onReceive方法中就可以接收到打電話應用發布的廣播。
package com.zh.ipdailor;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class CallRecevier extends BroadcastReceiver {
//接收到廣播時會調用。
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("電話已經收到!!!!");
}
}
打電話廣播中會攜帶號碼(也就是數據)接收者怎樣獲得該數據呢?
getResultData(); 返回值就是String 類型的 該值就是廣播攜帶的數據。
注:SharedPreferences 輕量級的存儲
將輸入框中的數據儲存在本地方法:
EditText et = (EditText) findViewById(R.id.et);
getSharedPreferences 方法對象是上下文Context
SharedPreferences sp =getSharedPreferences(name, mode) // name 文件的名字 mode 一般是私有MODE_PRIVATE
Editor ed = sp.edit();
ed.putString("ipName","et.getText().toString"); // ed.putString(key, value)
ed.commit(); //注意要提交。
finish(); //將 該Acativity結束掉。
在廣播接收者中讀取存在內存中的ip號碼,然後添加到廣播攜帶的數據的前面。 最後將數據再放回到廣播中。
package com.zh.ipdailor;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
public class CallRecevier extends BroadcastReceiver {
//接收到廣播時會調用。
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//在打電話廣播中會攜帶數據,通過getResultData 獲得
String number =getResultData();
//將儲存在SharedPreferences 中的數據取出
if(number.startsWith("0"))//判斷一下 加入撥打號碼的頭帶零 自動啟動Ip撥號器
{
SharedPreferences sp = context.getSharedPreferences("ip", Context.MODE_PRIVATE);
String ipName = sp.getString("ipName", "");
System.out.println("ipName"+ipName);
//把ip號碼拼接在 撥的號碼的前面
number= ipName+number;
//將拼接後的數據放回到廣播中。
setResultData(number);
}
}
}
撥號盤的數據被廣播攜帶著(非intent傳遞),數據在傳往打電話的應用中被廣播接收者截獲並修改了裡面的數據。
demo2:
短信防火牆
也是利用廣播,短信廣播。 //android.Provider.Telephoy.SMS_RECEIVIED
創建一個java類繼承BroadCastReceiver廣播接收者;
配置清單文件,添加receiver節點與activity同級節點。
//意圖過濾器中的action必須要和短信廣播的action一致。
//短信廣播的action
emulator control 模擬器控制器。
The Emulator Control tab, shown in Figure 1, is no longer supported. Use the Android Emulator for these features. //Google官網。
在extended controls 中有。
這裡也需要添加權限:
接收信息的權限。
從短信中拿取內容,不像打電話的廣播直接getResultData得到的是字符串String 但短信的內容太多了。
廣播的內容也可以用意圖發的,在短信中內容封裝在intent對象中。
pdu: 協議數據單元.
系統發送短信廣播時,是怎麼把短信內容存入廣播的,我們就只能怎麼取出來
* 如果短信過長,那麼發送時會拆分成多條短信發送,那麼短信廣播中就會包含多條短信
* 4.0之後,廣播接收者所在進程如果從來沒啟動過,那麼廣播接收者不會生效
* 4.0之後,如果系統自動關閉廣播接收者所在進程,在廣播中的action跟該廣播接收者的action匹配時,系統會啟動該廣播接收者所在的進程,但是如果是用戶手動關閉該進程,
那麼該進程會進入凍結狀態,再也不會啟動了,直到用戶下一次手動啟動該進程
取短信的方式:
//獲取短信的內容。短信的內容封裝在intent中的。
Bundle bundle= intent.getExtras();
//以pdus為鍵取出 一個object數組, 數組中的每一個元素都是一條短信。
Object[] objects= (Object[]) bundle.get("pdus");
for(Object object: objects )
{ //通過協議數據單元構造短信。
if (sms.getOriginatingAddress().equals("138438")) {
abortBroadcast();// 攔截廣播
// SmsManager.getDefault().sendTextMessage("138438", null,
// "你是個好人", null, null);
System.out.println(sms.getMessageBody());
}
短信應用收的是短信廣播。
短信防火牆設置的時候,要優先於短信應用之前收到短信,要不攔截不到短信。abortBroadCast(); 攔截廣播。
優先級的區間是-1000-1000 設置優先級在清單文件中將短信防火牆的priority(優先級) 、intent-filter android:priority=”1000”>
// 設置廣播接收者的優先級。 此時優先級最高。
4.0之後如果短信攔截沒有在系統上加載過,快捷圖標刪除後是不能正常運行的。也就是廣播接收者至少要在系統上運行一次。
resource —— values——Strings——可以更改app的名字 。將activity 下面的意圖過濾器刪除後廣播接收者,就不會再前台顯示,此時如果把進程即使殺死(不是用戶自行關閉)當有短信廣播時進程會自行啟動。當用戶手動關閉時廣播接收者處於凍結狀態只有下次被啟動時才會被打開。
SD卡監控:一個廣播接收者接收多條廣播 只需在一個Receiver節點下添加多個action即可。
SD卡廣播接收者 中的intent-filter 要與sd卡廣播的內容要匹配包括 action和data節點
4.3沒辦法卸載sdk卡可以在2.3模擬。
//sd卡掛載狀態。
// sd卡拔出狀態。
//sd卡未掛載。
//sd卡廣播中的scheme 就是file 要與其匹配。
android.content.BroadcastReceiver
package com.zh.sdlistenter;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;
public class SdListenter extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// 監控判斷sd卡的狀態
String action = intent.getAction();
if ("android.intent.action.MEDIA_MOUNTED".equals(action)) {
Toast.makeText(context, "sd卡已經加載成功", 0).show();
}
if ("android.intent.action.MEDIA_REMOVED".equals(action)) {
Toast.makeText(context, "sd卡已拔出", 0).show();
}
if ("android.intent.action.MEDIA_UNMOUNTED".equals(action)) {
Toast.makeText(context, "sd卡未加載不可用", 0).show();
}
}
}
開機啟動BroadCastReceiver:
BootReceiver:開機啟動廣播接收者 extends BroadCastReceiver
清單文件配置: intent-filter Boot_completed.
使Android機器返回鍵不能用可以禁用onBackPressed。
@Override
public void onBackPressed() {
// TODO Auto-generated method stub
// super.onBackPressed(); //該應用的返回鍵不能用。
}
}
廣播接收者屬於後台運行,要顯示在廣播接收者中定義顯示的activity,需要定義flag 新的界面任務棧;
package com.zh.jiechi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.view.ViewDebug.FlagToString;
import android.widget.Toast;
public class BootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//開機啟動設定界面。
Intent it = new Intent(context, MainActivity.class);
//此flag如不設定會導致開機時應用崩潰。 新的界面棧。
it.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(it);
}
}
監控手機應用狀態:
攜帶一個data
清單文件
//安裝應用
//刪除應用
//replaced 更新
//通過這個數據來告訴用戶哪個應用被刪了 和更新了。
這個更新 狀態的實現可是改變一下或加個空格等操作然後保存應用,加載到模擬器:模擬器實現的過程是先被卸載,後安裝,然後顯示更新了。
自定義廣播:
package com.zh.selfdefine;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
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();
intent.setAction("com.zh.zdy"); //這裡設置的action和接收端要保持一致。
//發送自定義廣播、
sendBroadcast(intent);
}
}
接收上面自定義的廣播;
的清單文件設置:
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
廣播的分類:
無序廣播:
所有與廣播中的action匹配的廣播接收者都可以收到這條廣播,並且是沒有先後順序,視為同時收到。
有序廣播: 優先級控制其先後順序;
所有與廣播中的action匹配的廣播接收者都可以收到這條廣播,但是是有先後順序的,按照廣播接收者的優先級排序。
有序廣播:
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();
intent.setAction("com.zh.fdm");
//發送有序廣播 resultReceiver 結果接收者 不需要在清單文件中設置,這個廣播接收者只接收該條廣播,並且是最後一個接收到該廣播的
// 並且一定能收到該廣播。
sendOrderedBroadcast(intent, null, new MyReceiver(), null, 0, "每人發100斤大米", null);
}
有序廣播接收者的清單文件設置:
設置優先級
有序廣播由於有先後順序,數據可以被修改,攔截; 像打電話,發短信都屬於有序廣播。
有序廣播接收者:
public class Sheng extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
//得到廣播中的內容
String text=getResultData();
System.out.println("省政府收到的文件"+text); //將原來的數據改變。
setResultData("每人發80斤大米"); //這個方法對於無序廣播是無效的。
}
}
有序廣播有一個最終廣播接收者:
最終接收者,最後一個並且一定能收到的,打電話的應用就是一個有序廣播而且是被定義最終接收者。
sendOrderedBroadcast(intent, null, new MyReceiver(), null, 0, "每人發100斤大米", null);
}
class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
String text = getResultData();
System.out.println("反貪局"+text);
}
由於業務關系,經常需要寫一些表單頁面,基本也就是簡單的增刪改查然後上傳,做過幾個頁面之後就有點想偷懶了,這麼低水平重復性的體力勞動,能不能用什麼辦法自動生成呢,查閱相關資
最近用到了AsyncTask,這玩意每個寫android程序的都會用,可是不見得每個人都能用的好。如果想要用好,那麼首先勢必對基本原理有個大概了解。其實網上對這類問題的說
有些童鞋想在Buzz桌面上弄點小浪漫、小驚喜、小文藝啥的,添加文字到桌面上是必不可少的,Buzzz桌面就能很方便的在桌面上添加文字,比如“Hon
Android APP 的運行環境Android 是一款基於 Linux 內核,面向移動終端的操作系統。為適應其作為移動平台操作系統的特殊需要,谷歌對其做了特