A.apk 使用aidl调用B.apk的Service的函数

来源:互联网 发布:2017网络知识竞赛答题 编辑:程序博客网 时间:2024/06/03 13:31

A.apk 使用aidl调用B.apk的Service的函数

B.apk
package="com.eddy.android.aidlcall"

新建一个IRemoteService.aidl文件
package com.eddy.android.aidlcall;

interface IRemoteService
{

 void manualUpdate(String location);

 void cancelUpdate();
}

新建一个RemoteService.class文件
public class RemoteService extends Service {



    @Override
    public IBinder onBind(Intent arg0) {
       
        return mBinder;
    }


    private final IBinder mBinder = new ServiceStub(this);
   
    static class ServiceStub extends IRemoteService.Stub{

        WeakReference<RemoteService> mService;
       
        public ServiceStub(RemoteService service) {
           
            mService = new WeakReference<RemoteService>(service);
        }
       
        public void cancelUpdateWeather() throws RemoteException {
           
            ....    //做你想做的。
        }

        public void manualUpdateWeather(String location) throws RemoteException {
           
            ......  //做你想做的。           
        }       
    }

}

在Android.mk
LOCAL_SRC_FILES := $(call all-java-files-under, src) /
    src/com/eddy/android/aidlcall/IWeatherRemoteService.aidl

在AndroidManifest.xml

        <service android:name="RemoteService">
            <intent-filter>
                <action android:name="android.intent.action.WEATHER_SERVICE" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>

A.apk

使用B.apk的Service的函数。

    在Activity中
    private IRemoteService mService = null;

    protected void onCreate(Bundle savedInstanceState){

        bindService(new Intent("android.intent.action.WEATHER_SERVICE"), mServiceConn,                     Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {

        unbindService(mServiceConn);// 取消service邦定
        super.onDestroy();
    }

    private void method(){

        mService.cancelUpdateWeather();        //--调用B.apk中的函数
        mService.manualUpdateWeather(null);    //--调用B.apk中的函数
    }

    private ServiceConnection mServiceConn = new ServiceConnection(){

        public void onServiceConnected(ComponentName name, IBinder service) {           
           
            mService = IWeatherRemoteService.Stub.asInterface(service);
        }

        public void onServiceDisconnected(ComponentName name) {
           
            //mService = null;
            //关闭service.
        }       
    };
   

    注意:
        将B.apk的IRemoteService.aidl文件生成的IRemoteService.java文件拷到a.apk的package下。