/****
* 監聽電話---在多頁面同時使用不產生影響的解決方法
* @author yjbo 2016年4月26日12:26:35
*/
第一個頁面
package cn.net.sougu.www.yjboapplication;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.TextView;
/****
* 監聽電話---在多頁面同時使用不產生影響的解決方法
* @author yjbo 2016年4月26日12:26:35
*/
public class MainActivity extends AppCompatActivity {
PhoneReceiver phoneReceiver = null;//電話監聽廣播
public final static String B_PHONE_STATE =
TelephonyManager.ACTION_PHONE_STATE_CHANGED;
String flag = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView second_txt = (TextView) findViewById(R.id.second_txt);
second_txt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//這裏的unregisterIt();方法還是沒有註銷的效果
flag = "跳轉到第二個頁面了";
L.i(MainActivity.this,"SouGUMainActivity-unregisterIt");
unregisterIt();
startActivity(new Intent(MainActivity.this,SecondActivity.class));
}
});
registerReceiver();
}
//按鈕1-註冊廣播
public void registerReceiver() {
L.i(MainActivity.this,"SouGUMainActivity--registerIt");
phoneReceiver = new PhoneReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(B_PHONE_STATE);
intentFilter.setPriority(Integer.MAX_VALUE);
registerReceiver(phoneReceiver, intentFilter);
}
//按鈕2-撤銷廣播
public void unregisterIt() {
L.i(MainActivity.this,"SouGUMainActivity--unregisterIt");
try {
if (phoneReceiver != null) {
unregisterReceiver(phoneReceiver);
}
} catch (Exception e) {
e.printStackTrace();
}
}
class PhoneReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//如果是去電
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
String phoneNumber = intent
.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
L.i(MainActivity.this,"SouGUMainActivity監聽打電話的功能"+ "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:
L.i(MainActivity.this,"SouGUMainActivity掛斷");
initData();
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
L.i(MainActivity.this,"SouGUMainActivity接聽");
break;
case TelephonyManager.CALL_STATE_RINGING:
L.i(MainActivity.this,"SouGUMainActivity響鈴:來電號碼" + incomingNumber);
//輸出來電號碼
break;
}
}
};
}
/***|
* 監聽電話之後所作出的請求數據操作
*/
private void initData() {
//初始化數據
if ("".equals(flag)){
//此時進行操作
}else{
/**
* 說明當前在跳轉的另一個頁面。如果另一個頁面想單獨在那個頁面進行監聽電話的處理,那麼這樣通過
* 增加標識的方法就可以更好的攔截(我的第二個頁面也同樣有增加攔截的代碼與該頁面一樣)
*/
}
}
/***
* 頁面在home鍵的後臺就會運行銷燬方法,
* 但是如果是跳到另一個頁面只要沒有finish()方法就不會執行銷燬;
* 同時上面再跳到另一個頁面時的銷燬監聽電話的方法也不起作用,具體原因不知道爲啥,
* 也沒找到方法,所以就要增加標識的方法簡潔不走那個方法、
*/
@Override
protected void onDestroy() {
super.onDestroy();
L.i(MainActivity.this,"SouGUMainActivity-onDestroy");
unregisterIt();
}
}
第二個頁面
package cn.net.sougu.www.yjboapplication;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
/****
* 在第二個頁面中也寫了監聽電話的方法,通過在第一頁面增加標識來攔截了第一頁面監聽電話的功能,從而不影響第二個頁面
*
* 監聽電話---在多頁面同時使用不產生影響的解決方法
*
* @author yjbo 2016年4月26日12:26:35
*/
public class SecondActivity extends AppCompatActivity {
PhoneReceiver phoneReceiver = null;//電話監聽廣播
public final static String B_PHONE_STATE =
TelephonyManager.ACTION_PHONE_STATE_CHANGED;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
registerReceiver();
}
//按鈕1-註冊廣播
public void registerReceiver() {
L.i(SecondActivity.this,"SouGUMainSecondActivity-registerIt");
phoneReceiver = new PhoneReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(B_PHONE_STATE);
intentFilter.setPriority(Integer.MAX_VALUE);
registerReceiver(phoneReceiver, intentFilter);
}
//按鈕2-撤銷廣播
public void unregisterIt() {
L.i(SecondActivity.this,"SouGUMainSecondActivity-unregisterIt");
try {
unregisterReceiver(phoneReceiver);
} catch (Exception e) {
e.printStackTrace();
}
}
class PhoneReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//如果是去電
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
String phoneNumber = intent
.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
L.i(SecondActivity.this,"SouGUMainSecondActivity-監聽打電話的功能"+"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:
L.i(SecondActivity.this,"SouGUMainSecondActivity-掛斷");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
L.i(SecondActivity.this,"SouGUMainSecondActivity-接聽");
break;
case TelephonyManager.CALL_STATE_RINGING:
L.i(SecondActivity.this,"SouGUMainSecondActivity-響鈴:來電號碼" + incomingNumber);
//輸出來電號碼
break;
}
}
};
}
/**
* 方法必須重寫
*/
@Override
protected void onDestroy() {
super.onDestroy();
L.i(SecondActivity.this,"SouGUMainSecondActivity-onDestroy");
unregisterIt();
}
}
權限:(2個)
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
源碼地址:http://download.csdn.net/detail/yangjianbo456/9502917
權作學習交流使用,歡迎交流討論