Android - 停止PhoneStateListener / BR / UnregisterReceiver

时间:2013-06-06 03:52:12

标签: android

我有问题要停止PhoneStateListener。我试图使用unregisterReceiver()但它没有用。我确实阅读了网站,看到我必须使用LISTEN.NON,但我无法做到。

我的问题如下:
1 - 我在哪里放置“telephony.listen(listener,PhoneStateListener.LISTEN_NONE);”在我的代码中?
2 - 我是否必须使用unregisterReceiver?

我的代码不容易解释而且很长,所以我不会提供所有代码而只是主视图。

实际上:我从计时器启动服务。此服务注册BR

/ *第一个* /

public class TmrSettingsCheck extends BroadcastReceiver
 {
  public void setTimer(long milli)
   { // setRepeating } 

  public void onReceive(Context context, Intent intent)         
   {
    // Try to know if we have to start or stop the service
    context.startService(new Intent(context, SvcCall.class));  
    OR
    context.stopService(new Intent(context, SvcCall.class));
   }
 }

/ *第二个* /

public class SvcCall extends Service
 {
  private BroadcastReceiver br_call;

  public void onCreate()
   { // Creation }

  public int onStartCommand(Intent intent, int flags, int startId)
   {  
    // register the broadcast receiver
    IntentFilter filter = new IntentFilter();
    filter.addAction(ACTION_OUT);
    filter.addAction(ACTION_IN);
    this.br_call = new CallBR(this._context);
    this.registerReceiver(this.br_call, filter);
    return (START_STICKY);
   }

  public class CallBR extends ClsCallReceiver
   {
    public CallBR(Context context)  
     { // constructor }

    protected void onIncomingCallStarted(String number, Date start) 
     { // XYZ
     }

    protected void onIncomingCallEnded(String number, Date start, Date end) 
     { // XYZ }

    protected void onOutgoingCallStarted(String number, Date start) 
     { // XYZ }

    protected void onOutgoingCallEnded(String number, Date start, Date end) 
     { // XYZ }

    protected void onMissedCall(String number, Date start) 
     { // XYZ }
   }

  public IBinder onBind(Intent intent)
   { return null; }

  public void onDestroy()
  {
   this.unregisterReceiver(this.br_call);          
   super.onDestroy();
   } 
 }

/ *第三个* /

public abstract class ClsCallReceiver extends BroadcastReceiver 
 {
  public static PhonecallStartEndDetector listener;
  String outgoingSavedNumber;
  protected Context savedContext;
  TelephonyManager telephony;

  public void onReceive(Context context, Intent intent) 
   {
    savedContext = context;
    if (listener == null)
     listener = new PhonecallStartEndDetector();

    if (intent.getAction().equals("android.intent.action.NEW_OUTGOING_CALL")) 
     {
      listener.setOutgoingNumber(intent.getExtras().getString("android.intent.extra.PHONE_NUMBER"));
      return;
     }
    this.telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
    this.telephony.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
   }

  public class PhonecallStartEndDetector extends PhoneStateListener 
   {
    public PhonecallStartEndDetector() 
     { // XYZ }

    public void onCallStateChanged(int state, String incomingNumber) 
     { // XYZ }    
   }

  protected abstract void onIncomingCallStarted(String number, Date start);
  protected abstract void onOutgoingCallStarted(String number, Date start);
  protected abstract void onIncomingCallEnded(String number, Date start, Date end); 
  protected abstract void onOutgoingCallEnded(String number, Date start, Date end);
  protected abstract void onMissedCall(String number, Date start);   
 }

1 个答案:

答案 0 :(得分:4)

使用LISTEN_NONE作为listen方法的参数来停止侦听更新。这将使听众听不到。

telephonymanager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE );