Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无法注销phonestatelistener_Android_Android Intent - Fatal编程技术网

Android 无法注销phonestatelistener

Android 无法注销phonestatelistener,android,android-intent,Android,Android Intent,我正在尝试将以下内容集成到我的代码中以注销phonestatelistener TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); if(mgr != null) { mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); } 我有一个在后台运行的服务,它检查一个号码是否在阻止列表中。如果是,则调用Pho

我正在尝试将以下内容集成到我的代码中以注销phonestatelistener

TelephonyManager mgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
if(mgr != null) {
    mgr.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE); 
} 
我有一个在后台运行的服务,它检查一个号码是否在阻止列表中。如果是,则调用
PhonestateListener

TelephonyManager mTM = (TelephonyManager)this.getSystemService(Context.TELEPHONY_SERVICE);
mTM.listen(new phoneStateListener(NumberInbound,Msg_to_display,mTM), PhoneStateListener.LISTEN_CALL_STATE);
但是当我从阻止列表中删除一个数字时,我想注销
phonestatelistner
。相反,发生的情况是,
phonestatelistener
始终被注册,而我之前删除的msisdn仍然被阻止

你能帮忙吗

电话状态列表的代码

class phoneStateListener extends PhoneStateListener {

    String inbounda;
    int MessagetoDisplay;
    String msg;
    String reply;
    TelephonyManager myt;
    MyService calltoService;
    boolean mBound = false;
    private static final String TAG = "PHONELISTENER";

    phoneStateListener(String inbound,int Message,TelephonyManager t) {
        inbounda = inbound;
        MessagetoDisplay = Message;
        myt = t;
    }

    public void onCallStateChanged(int state, String incomingNumber) {

        if(!incomingNumber.equals(inbounda)){

        } else { 

            final String TAG = "Phone call"; 
            ITelephony telephonyService;
        //new code
            Log.v("Phone State", "state:"+state);

            switch (state) {
                case TelephonyManager.CALL_STATE_IDLE:
                   Log.v("Phone State", "incomingNumber:"+incomingNumber+" ended");
                    break;
                case TelephonyManager.CALL_STATE_OFFHOOK:
                    Log.v("Phone State", "incomingNumber:"+incomingNumber+" picked up");
                    break;
                case TelephonyManager.CALL_STATE_RINGING:
                    if(inbounda.equalsIgnoreCase(incomingNumber)){
                        Log.v("ARE THE SAME...............................", "incomingNumber:"+incomingNumber+ "inbound:"+ inbounda + "MSG TO DISPLAY" +msg);

                        try{
                            Class c = Class.forName(myt.getClass().getName());   
                            Method m = c.getDeclaredMethod("getITelephony");   
                            m.setAccessible(true);   
                            telephonyService = (ITelephony) m.invoke(myt);   
                            telephonyService.silenceRinger();   
                            telephonyService.endCall();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        try{
                            Thread.currentThread().sleep(4000);
                            replyChecker(MessagetoDisplay);
                        } catch(InterruptedException ie){

                        }
                    }
                    break;
                default:
                    break;
            }
        }
    }

    public String replyChecker(int Check) {
        SmsManager mySMS = SmsManager.getDefault();
        String destination = inbounda;     
        //open - to be extended to allow user to define own tailored message 
        String Meeting = "Sorry I am at a meeting. Graham  ";
        String Gym = "I am currently at the gym and will respond to you later. Graham ";
        String NewYearsEve = "Happy New Year to you and your loved ones. Graham ";

        if(Check == 1) {
            Log.v("HERE NOW1",":");
            reply  = Meeting;

            mySMS.sendTextMessage(destination, null, Meeting, null, null);
            return reply;
        } else if (Check == 2) {
            Log.v("HERE NOW2",":");
            reply = Gym;
            mySMS.sendTextMessage(destination, null, Gym, null, null);
            return reply;
        } else if (Check == 3) {
            Log.v("HERE NOW3",":");
            reply = NewYearsEve;
            mySMS.sendTextMessage(destination, null, NewYearsEve, null, null);
            return reply;
        }
        // TODO Auto-generated method stub
        return reply;
    }
}
我在我的应用程序中有多个活动,我需要一种方法来保持状态,以防手机在活动之间进入待机状态和初始化状态

当用户使用你的应用程序时,手机将不会进入待机状态,而且肯定不会处于活动之间,假设任何与正常应用程序流程相似的情况。设备只有在不活动后才会进入睡眠状态,当用户点击某个东西从一个活动移动到下一个活动时,不活动计时器将重置


如果您希望在屏幕上显示某些活动时保持设备处于唤醒状态,请使用android:keepScreenOn或在一些
视图上查看
,这样您就不必麻烦您自己的
唤醒锁

实际上,我通过在服务中实现广播接收器解决了这个问题。我面临的问题不是PowerManager,而是服务没有监听来电

一个收听android.intent.action.PHONE_状态的广播接收器完成了这项工作


谢谢格雷厄姆

有什么想法吗?好像phonestatelistener一直在监听我无法注销它“程序状态丢失”是什么意思,这听起来与Wakelocks无关?谢谢Blundell的回答。我对程序状态的描述不正确,我已经编辑了我的问题。我的意思是,当我有一个包含多个活动和一项服务的应用程序时,当我在这些活动(或手机休眠)之间导航时,状态信息即存储的哈希数据不再被引用。我读到wakelocks或WindowsManager可以在这种情况下提供帮助,但我不清楚正确的方法是什么。再次感谢