【问题标题】:How to Communicate with Service如何与服务沟通
【发布时间】:2014-01-29 06:33:43
【问题描述】:

我正在使用 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 与我的服务通信。 你能帮我解决这个问题吗?

【问题讨论】:

  • 我试试你的代码。但是得到错误无法解析 com.android.internal.telephony.IExtendedNetworkService

标签: android service broadcast ussd


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2018-08-07
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多