/****
* 监听电话---在多页面同时使用不产生影响的解决方法
* @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
权作学习交流使用,欢迎交流讨论