Android 监听电话---在多页面同时使用不产生影响的解决方法

/****
 * 监听电话---在多页面同时使用不产生影响的解决方法
 * @author yjbo 201642612: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 201642612: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 201642612: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
权作学习交流使用,欢迎交流讨论
发布了82 篇原创文章 · 获赞 22 · 访问量 20万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章