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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章