2014-01-29 94 views
0

我正在使用USSDInterceptor服务在我的应用程序中获取USSD响应。这里是服务:如何与服务进行通信

package com.codedemigod.services; 

    import com.android.internal.telephony.IExtendedNetworkService; 


    public class CDUSSDService extends Service{ 

    private String TAG = CDUSSDService.class.getSimpleName(); 
    private boolean mActive = false; //we will only activate this "USSD listener" when we want it 

    BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals(Intent.ACTION_INSERT)){ 
       //activity wishes to listen to USSD returns, so activate this 
       mActive = true; 
       Log.d(TAG, "activate ussd listener"); 
      } 
      else if(intent.getAction().equals(Intent.ACTION_DELETE)){ 
       mActive = false; 
       Log.d(TAG, "deactivate ussd listener"); 
      } 
     } 
    }; 

    private final IExtendedNetworkService.Stub mBinder = new IExtendedNetworkService.Stub() { 
     public void clearMmiString() throws RemoteException { 
      Log.d(TAG, "called clear"); 
     } 

     public void setMmiString(String number) throws RemoteException { 
      Log.d (TAG, "setMmiString:" + number); 
     } 

     public CharSequence getMmiRunningText() throws RemoteException { 
      if(mActive == true){ 
       return null; 
      } 

      return "USSD Running"; 
     } 

     public CharSequence getUserMessage(CharSequence text) 
       throws RemoteException { 
      Log.d(TAG, "get user message " + text); 
      //getApplicationContext().sendBroadcast(new Intent("ussdMsg")); 


      if(mActive == false){ 
       //listener is still inactive, so return whatever we got 
       Log.d(TAG, "inactive " + text); 
       return text; 
      } 

      //listener is active, so broadcast data and suppress it from default behavior 

      //build data to send with intent for activity, format URI as per RFC 2396 
      Uri ussdDataUri = new Uri.Builder() 
      .scheme(getBaseContext().getString(R.string.uri_scheme)) 
      .authority(getBaseContext().getString(R.string.uri_authority)) 
      .path(getBaseContext().getString(R.string.uri_path)) 
      .appendQueryParameter(getBaseContext().getString(R.string.uri_param_name), text.toString()) 
      .build(); 


      getApplicationContext().sendBroadcast(new Intent(Intent.ACTION_GET_CONTENT, ussdDataUri)); 

      mActive = false; 
      return null; 
     } 
    }; 



    @Override 
    public IBinder onBind(Intent intent) { 
     Log.i(TAG, "called onbind"); 

     //the insert/delete intents will be fired by activity to activate/deactivate listener since service cannot be stopped 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_INSERT); 
     filter.addAction(Intent.ACTION_DELETE); 
     filter.addDataScheme(getBaseContext().getString(R.string.uri_scheme)); 
     filter.addDataAuthority(getBaseContext().getString(R.string.uri_authority), null); 
     filter.addDataPath(getBaseContext().getString(R.string.uri_path), PatternMatcher.PATTERN_LITERAL); 
     registerReceiver(receiver, filter); 

     return mBinder; 
    } 
    } 

我不知道如何与我的活动与此服务进行通信。我已经在我的活动中使用了BroadcastReceiver,如下所示:

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     updateUI(intent); 
    } 
}; 

@Override 
public void onResume() { 
    super.onResume(); 
    registerReceiver(broadcastReceiver, new IntentFilter(Intent.ACTION_GET_CONTENT)); 
} 

但我无法获得广播。难道我做错了什么?我不知道我应该使用BroadcastReceiver,或者我应该通过bindService与我的服务进行通信。 你是否应该帮我解决这个问题?

+0

我试试你的代码。但获取错误无法解析com.android.internal.telephony.IExtendedNetworkService – Plugie

回答

0

我自己解决了这个问题。问题在于调用'unregisterReceiver'。我在onPause()上调用了unregisterReceiver(),并且在获取USSD结果期间,似乎没有注册BroadcastReceiver。所以我把它放在onDestroy()方法上,最后我设法得到广播消息。这里是我的onDestroy方法:

@Override 
public void onDestroy() { 
    Log.i(TAG, "unregister"); 
    unregisterReceiver(broadcastReceiver);  
    super.onDestroy();    
} 
相关问题