Android - 取消注册后,来电的广播接收器保持活动状态

时间:2014-01-30 00:24:16

标签: android broadcastreceiver call block

我有一个广播接收器,用于收听来电事件。它以编程方式定义,而不是在清单中。目的是在用户选择时阻止所有呼叫。但在我取消注册广播接收器并关闭注册它的服务后,接收器保持活动状态并仍然阻止呼叫。 我试过的:

1)我尝试在我在这个应用程序中已经拥有的另一个广播接收器类中实现此接收器并且工作正常...这意味着在取消注册后它停止侦听其他事件。当它停止收听其他事件时,它会一直听到来电事件。 (这简直太奇怪了)

2)我尝试在单独的broacast接收器类中实现来电接收器,并将其注册到单独的服务中。即使我杀了这项服务后它仍然活着。 呼叫接收器仅在整个应用关闭时才会消失。

3)我尝试使用活动而不是服务来做同样的事情。

在服务的情况下调用OnDestory。并且在使用活动时问题仍然存在。 这是如何解释的,如何解决这个问题?

这是我的单独的broacast接收器类和单独的服务实现的代码:

package com.android.internal.telephony;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class CallBlockBroadcastReceiver extends BroadcastReceiver{
    BroadcastReceiver CallBlocker;
     TelephonyManager telephonyManager;
     ITelephony telephonyService;
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
         // TODO Auto-generated method stub
         String number=intent.getExtras().getString("incoming_number");
         Toast.makeText(context, number, Toast.LENGTH_SHORT).show();
         telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
         //Java Reflections
         Class c = null;

         try {  c = Class.forName(telephonyManager.getClass().getName());} 
         catch (ClassNotFoundException e) {     e.printStackTrace();    }
         Method m = null;

         try {  m = c.getDeclaredMethod("getITelephony");} 
         catch (SecurityException e) {      e.printStackTrace();    } 
         catch (NoSuchMethodException e) {  e.printStackTrace();    }

         m.setAccessible(true);

         try {  telephonyService = (ITelephony)m.invoke(telephonyManager);} 
         catch (IllegalArgumentException e) {e.printStackTrace();} 
         catch (IllegalAccessException e) {e.printStackTrace();} 
         catch (InvocationTargetException e) {e.printStackTrace();}

         telephonyManager.listen(callBlockListener, PhoneStateListener.LISTEN_CALL_STATE);
    }
     PhoneStateListener callBlockListener = new PhoneStateListener(){
         public void onCallStateChanged(int state, String incomingNumber){
             if(state==TelephonyManager.CALL_STATE_RINGING){
                     try {
                         telephonyService.endCall();
                     } catch (Exception e) {
                         e.printStackTrace();
                     }

             }
         }
     };

}

ITelephony类:

package com.android.internal.telephony;
interface ITelephony {

 boolean endCall();

 void answerRingingCall();

 void silenceRinger();
}

我的服务

import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;

import com.android.internal.telephony.CallBlockBroadcastReceiver;

public class BroadcastService extends Service{
CallBlockBroadcastReceiver callBlockBroadcastReceiver = new CallBlockBroadcastReceiver();
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub

            getBaseContext().registerReceiver(callBlockBroadcastReceiver, new IntentFilter("android.intent.action.PHONE_STATE"));


        return START_STICKY;

    }

    @Override
    public void onDestroy() {

            getBaseContext().unregisterReceiver(callBlockBroadcastReceiver);


        // TODO Auto-generated method stub
        super.onDestroy();
    }


    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

}

1 个答案:

答案 0 :(得分:0)

我猜想你的服务中没有调用onDestroy()。是否还有任何绑定服务?您确定要在服务上调用stopService(intent)吗?