① 12、注冊廣播有幾種方式,這些方式有何優缺點請談談android引入廣播機制的用意。
注冊廣播的分類:靜態注冊和動態注冊。
靜態注冊:在清單文件里直接注冊,從app開啟到app銷毀,一直在接收廣播,接收廣播時間長,但是接收廣播的優先順序低於動態注冊廣播。
動態注冊:動態注冊,動態銷毀,從onCreate到取消注冊,期間接收廣播,接收廣播時間是短且可控,接收廣播的優先順序高。例如:
發送廣播:
Intent i = new Intent();
i.setAction("ACTION_CLOSE");
sendBroadcast(i);
接受廣播:
onCreate(){
//注冊廣播的接受者
IntentFilter filter = new IntentFilter();
filter.addAction("ACTION_CLOSE_ACTIVITY");
receiver = new InnerReceiver();
registerReceiver(receiver, filter);
}
private class InnerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//TODO 當前Activity接收到廣播 需要做的事情
}
}
}
//注銷廣播
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
2.引入廣播的原因:
a) 不同的app之間傳信通用
b)發出一條指定,需要多個Activity都需要有反應
注意:以上僅供參考,如有疑問,請追問,謝謝。
② 簡述在android中如何發送廣播消息
1.發送廣播
Intent intent = new Intent(BroadcastAction);
Bundle bundle = new Bundle();
bundle.putString("***", SUCCESS);
bundle.putString("FullPathName", mFullPathName);
intent.putExtras(bundle);
sendBroadcast(intent);
2.在Activity中創建一個內部類MyBroadcastReceiver擴展BroadcastReceiver,並在其中實現onReceive方法。
3.在Activity中聲明一個MyBroadcastReceiver類型的成員變數,並注冊:
private MyBroadcastReceiver myBroadcastReceiver;
...
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(BroadcastAction);
registerReceiver(receiver, filter);
4.使用完後要記得釋放
unregisterReceiver(receiver);
註:1和2中的 BroadcastAction要是同一個Action
③ android的混合開發 JS頁面能接收廣播嗎 在網頁接收不到藍牙按鍵的事件和廣播
不是手機的問題,耳機的問題。
藍牙耳機不止一種,我所知的一種是a2dp的一種不是a2dp的,a2dp的耳機就是可以聽歌的,另外一種不能聽歌
對於a2dp的耳機,如果短按一次hook鍵,系統會當作一個keyevent來處理,走的是發送廣播的流程。如果短按多次,或者長按一次hook 鍵,不會有keyevent,會當作一個類似與「BVRA」的AP命令來處理,處理過程可以參考源碼的BluetoothHandsfree.java, 這個時候就收不到廣播。
而對於不是a2dp的耳機,無論怎樣按按鍵,都是發送ap命令,不會收到keyevent。
解決方法有兩個,一是換個耳機,二是改rom,在藍牙bsp那部分,無論什麼耳機都走keyevent的流程
④ android service的監聽前台點擊事件怎麼寫
第一種辦法是廣播,一般來說系統對於音量鍵和Home鍵會發送廣播,我們可以再廣播中監聽這些按鍵信息。具體的IntentFilter怎麼寫,大家可以網路一下。
第二種辦法仍然是廣播,不過這就需要修改SDK了,在WindManagerService裡面,分發按鍵事件的時候的發送特殊的廣播的,這個改動可能比較麻煩。
第三種辦法是直接讀取輸入設備文件,一般該文件位於/dev/input/文件夾下面,不過裡面一般有多個文件,具體哪個文件描述的哪一個輸入設備,需要大家進行嘗試。設備的文件的讀取需要使用c或者c++來完成。具體的實現代碼可以參考:https://github.com/radhoo/android-event-injector。這種辦法需要有root許可權才行,而且讀取的鍵值是沒有做過轉換的,也就是說和我們平常使用的鍵值是不一樣的。其實大家可以在adb shell中,通過getevent查看。
第四種辦法是使用系統的無障礙服務,也就是AccessibilityService。我最終採用的方式就是這個,因為這個不僅可以監聽按鍵,還能攔截。關於AccessibilityService的實現,網上講的比較多了。我這里只提幾個需要注意的點: