編輯:關於Android編程
在intent-filter的節點中,指定action子節點,action的值必須跟要接受的廣播中的action匹配,比如,如果要接受打電話廣播, 那麼action的值必須指定為
<action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
因為打電話廣播中所包含的action,就是"android.intent.action.NEWOUTGOINGCALL",所以我們定義廣播接收者時, action必須與其匹配,才能收到這條廣播
即便廣播接收者所在進程已經被關閉,當系統發現系統發出的廣播中的action跟該廣播接收者的action匹配時,系統會啟動該廣播接收者所在的進程, 並把廣播發給該廣播接收者
原理:接收撥打電話的廣播,修改廣播內攜帶的電話號碼 * 定義廣播接收者接收打電話廣播extends BroadcastReceiver ,相當於買了一個收音機。
public class CallReceiver extends BroadcastReceiver {
//當廣播接收者接收到廣播時,此方法會調用
@Override
public void onReceive(Context context, Intent intent) {
//拿到用戶撥打的號碼
String number = getResultData();
//修改廣播內的號碼
setResultData("17951" + number);
}
}
在清單文件中定義該廣播接收者接收的廣播類型,安裝了一塊電池。指定action具體調到一個合適的頻道
接收打電話廣播需要權限
即使廣播接收者的進程沒有啟動,當系統發送的廣播可以被該接收者接收時,系統會自動啟動該接收者所在的進程
系統收到短信時會產生一條廣播,廣播中包含了短信的號碼和內容
定義廣播接收者接收短信廣播
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);
System.out.println(sms.getMessageBody());
System.out.println(sms.getOriginatingAddress());
}
}
系統創建廣播時,把短信存放到一個數組,然後把數據以pdus為key存入bundle,再把bundle存入intent清單文件中配置廣播接收者接收的廣播類型,注意要設置優先級屬性,要保證優先級高於短信應用,才可以實現攔截
添加權限
4.0以後廣播接收者安裝以後必須手動啟動一次,否則不生效
4.0以後廣播接收者如果被手動關閉,就不會再啟動了清單文件中定義廣播接收者接收的類型,監聽SD卡常見的三種狀態,所以廣播接收者需要接收三種廣播
廣播接收者的定義
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卡被拔出");
}
}
}
清單文件中配置接收開機廣播
權限
定義廣播接收者
@Override
public void onReceive(Context context, Intent intent) {
//開機的時候就啟動勒索軟件
Intent it = new Intent(context, MainActivity.class);
context.startActivity(it);
}
以上代碼還不能啟動MainActivity,因為廣播接收者的啟動,並不會創建任務棧,那麼沒有任務棧,就無法啟動activity手動設置創建新任務棧的flag
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
原理:應用在安裝卸載更新時,系統會發送廣播,廣播裡會攜帶應用的包名 * 清單文件定義廣播接收者接收的類型,因為要監聽應用的三個動作,所以需要接收三種廣播
廣播接收者的定義
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 + "被卸載了");
}
}
獲取電話管理器,設置偵聽
TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
tm.listen(new MyPhoneStateListener(), PhoneStateListener.LISTEN_CALL_STATE);
偵聽對象的實現
class MyPhoneStateListener extends PhoneStateListener{
//當電話狀態改變時,此方法調用
@Override
public void onCallStateChanged(int state, String incomingNumber) {
// TODO Auto-generated method stub
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE://空閒
if(recorder != null){
recorder.stop();
recorder.release();
}
break;
case TelephonyManager.CALL_STATE_OFFHOOK://摘機
if(recorder != null){
recorder.start();
}
break;
case TelephonyManager.CALL_STATE_RINGING://響鈴
recorder = new MediaRecorder();
//設置聲音來源
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//設置音頻文件格式
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setOutputFile("sdcard/haha.3gp");
//設置音頻文件編碼
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
try {
recorder.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
}
}
}
An Overview of the“Topology”TabZenmap's“Topology”t
Android中自定義View的實現比較簡單,無非就是繼承父類,然後重載方法,即便如此,在實際編碼中難免會遇到一些坑,我把自己遇到的一些問題和解決方法總結一下,希望對廣大
android系統介紹Android(安卓),是一個以Linux為基礎的開源移動設備操作系統,主要用於智能手機和平板電腦,由Google成立的Open Handset A
下拉刷新對於一個app來說是必不可少的一個功能,在早期大多數使用的是chrisbanes的PullToRefresh,或是修改自該框架的其他庫。而到現在已經有了更多的選擇