android添加監聽
⑴ android開發怎麼監控來電並監聽
實現如下廣播,並且在AndroidManifest中進行注冊
public class PhoneReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("action"+intent.getAction());
//如果是去電
if(intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)){
String phoneNumber = intent
.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.d(TAG, "call OUT:" + phoneNumber);
}else{
//查了下android文檔,貌似沒有專門用於接收來電的action,所以,非去電即來電.
//如果我們想要監聽電話的撥打狀況,需要這么幾步 :
* 第一:獲取電話服務管理器TelephonyManager manager = this.getSystemService(TELEPHONY_SERVICE);
* 第二:通過TelephonyManager注冊我們要監聽的電話狀態改變事件。manager.listen(new MyPhoneStateListener(),
* PhoneStateListener.LISTEN_CALL_STATE);這里的PhoneStateListener.LISTEN_CALL_STATE就是我們想要
* 監聽的狀態改變事件,初次之外,還有很多其他事件哦。
* 第三步:通過extends PhoneStateListener來定製自己的規則。將其對象傳遞給第二步作為參數。
* 第四步:這一步很重要,那就是給應用添加許可權。android.permission.READ_PHONE_STATE
TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
//設置一個監聽器
}
}
PhoneStateListener listener=new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String incomingNumber) {
//注意,方法必須寫在super方法後面,否則incomingNumber無法獲取到值。
super.onCallStateChanged(state, incomingNumber);
switch(state){
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("掛斷");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("接聽");
break;
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("響鈴:來電號碼"+incomingNumber);
//輸出來電號碼
break;
}
}
⑵ Android 超簡單實現網路狀態的監聽
我們做項目的時候,不可避免的要做網路狀態的監聽,一般我們都是抽取出一個工具類來實現,比如:
細致的你當然還會再寫一個判斷網路類型的方法,反手再來一個例:
然後就可以在相應的操作前進行判斷網路的判斷:
但是這樣做也有些問題:
接下來就是本文的重點,如何通過 NetStatusBus 這個庫來解決以上問題,讓你的網路狀態監聽變得前所未有的簡單粗暴。
到這里就已經結束了,你的所有網路操作已經都可以清晰優雅的在訂閱方法中進行處理了,當然你也可以繼續往下看。
訂閱方法必須填寫一個NetType參數,可以通過NetType的值來判斷當前網路類型。
@NetSubscribe中 netType為可選值,可以設置訂閱的類型,可選值類型如下:
NetType.AUTO
這是默認值,任何網路狀態發生變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:
只要當前是由 WIFI 改變引發的網路狀態變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:
只要當前是由移動網路改變引發的網路狀態變化,該類型訂閱者都會被回調。同時會傳入NetType參數告知你當前的網路類型,示例如下:
NetType.NONE
只有當網路丟失時,該類型訂閱者才會被回調。
有人會覺得,我用個庫爽就行了管它的原理干什麼?
你放心,我只是小小的描述一下實現方式。
原理簡單來說,就是在全局初始化的時候就綁定對網路的變化監聽。然後將進行注冊的父類所有的訂閱方法保存至集合中,這里涉及到一些方法的校驗,最後在網路狀態發生改變時利用 java 反射機制遍歷執行所有訂閱方法。熟悉 EventBus 的小夥伴已經看出來了這里借鑒了一小部分 EventBus 的思想。
回到第一步,那麼具體是如何綁定對網路狀態變化的監聽呢?
以前我們是通過注冊廣播來實現綁定網路變更的監聽,在Android 7.0 以後,Google 基於性能和安全原因對廣播進行了很多限制,比如監聽網路變更的廣播 android.net.conn.CONNECTIVITY_CHANGE 使用靜態注冊的方式則無法生效,而動態注冊的方式雖然可以生效但畢竟不是最優解。
同樣出於性能和安全,以及擁抱變化的角度,最終我們還是使用官方推薦的方式,利用 ConnectivityManager.NetworkCallback 來進行網路變化的監聽,這是在Android 5.0即android api 21推出的API,目前Android 5.0以上的市場佔有率在 85%以上,隨著國內各大廠商正在積極的推進適配普及Android Q,這個比例還會進一步增大,所以個人人認為無需過於擔心低版本適配。
使用的時候出現這個問題是由於少添加了許可權。
Caused by: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
java.lang.RuntimeException: Unable to create application com.jiyun.wanandroid.WanApplication: java.lang.SecurityException: ConnectivityService: Neither user 10513 nor current process has android.permission.ACCESS_NETWORK_STATE.
加上這幾個許可權就好了:
附上原文地址: https://www.jianshu.com/p/2fea980b3e56
⑶ android 怎麼自定義監聽事件
新建一個android工程,找到工程下res->layout->activity_main.xml文件並打開
從左側工具欄,拖入button到界面上,button默認id為button1
1、在Activity中給button綁定監聽事件(setOnClickListener),代碼如下:
//button綁定監聽事件
Button btn = (Button)findViewById(R.id.button1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder build = new Builder(MainActivity.this);
build.setMessage("Test").show();
}
});
2、直接在layout.xml中綁定onclick事件;
同時添加對應的監聽事件處理函數
public void Test(View v){
AlertDialog.Builder build = new Builder(this);
build.setMessage("Test").show();
}
運行程序,在模擬器/真機中查看效果
點擊button,彈出Test提示框,說明事件綁定成功。
⑷ android怎麼實現監聽用戶輸入
只要是監聽用戶輸入相關屬性只要進行修改了都會自加。有了這個說明,自己對android虛擬機上的聯系人進行測試,然後把sqlit資料庫導出進行查看,發現VERSION確實發生了改變。有了這個依據,便能很好的解決監聽用戶輸入聯系人數據變化。
首先我先放上一段JAVA的demo展現思路。android代碼稍後放上。
public class ContactJianTing
{
public static void main(String args[])
{
init();
String str = "1-2";
String a[] =str.split("-");
for (String string : a)
{
System.out.println(string);
}
}
private static void init()
{
HashMap a = new HashMap();
HashMap b = new HashMap();
for (int key = 1; key <= 1000; key++)
{
a.put(String.valueOf(key), String.valueOf(key));
b.put(String.valueOf(key), String.valueOf(key+1));
}
Set aSet = a.keySet();
for (String string : aSet)
{
System.out.println(string);
}
long start = System.currentTimeMillis();
for(int i = 1;i<=1000;i++)
{
System.out.println("號碼 "+i);
if(!a.get(String.valueOf(i)).equals(b.get(String.valueOf(i))))
{
System.out.println("數據不同");
}
System.out.println("-----------");
}
long end = System.currentTimeMillis();
long sum = end - start;
System.out.println("總共耗時"+sum);
}
}
在沒有連接資料庫的情況下,使用HashMap,1000條數據耗時40毫秒左右。對於用戶而言,擁有1000個聯系人的手機畢竟少之又少。
⑸ android怎麼監聽輸入字
使用EditText的addTextChangedListener(TextWatcher watcher)方法對EditText實現監聽,TextWatcher是一個介面類,所以必須實現TextWatcher里的抽象方法:
當EditText裡面的內容有變化的時候,觸發TextChangedListener事件,就會調用TextWatcher裡面的抽象方法。