[AS 2.1.3开发实践] 安卓AIDL的使用

最近公司的项目需要用到第三方app访问自己的软件获取数据,开始使用内容提供者,后面需要判断哪些app才可以获取,而内容提供者可是所有第三方都允许的。所以只能换了,后面在同事那边知道了AIDL就找了些资料,看了下都是以前的EC版本的,也有一篇AS的。我看了下实现了功能,就放出来当个笔记了。

参考的文章  

新增一个ADIL接入说明

AIDL接入Android 8.0和Android 11以上版本需要添加的设置

1.在需要分享出信息的软件里面创建AIDL文件。

之后命令生成一个XXXX.AIDL文件

删掉里面自带的方法。添加自己需要的方法

我添加了两个String的方法 一个用来获取name 一个用来获取pwd

interface GetInformationManager {

    String getName(String packname);

    String getPwd(String packname);
}

我里面要求传参数 是为了做一些判断而已,用来判断允许哪些第三方软件可以访问我的数据

这之后请clean或者rebuild你的项目,为了让AS生成相对应的JAVA文件

没错之后再进行下一步。

生成的位置如下

2.创建一个自己的服务来实现AIDL的方法

代码:

/**
 * Created by Administrator on 2016/11/2.
 */
public class GIMService extends Service{

    private final GetInformationManager.Stub manager = new GetInformationManager.Stub() {
        @Override
        public String getName(String packname) throws RemoteException {
            return Tools.username;
        }

        @Override
        public String getPwd(String packname) throws RemoteException {
            return Tools.userpwd;
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {

        return manager;
    }
}

由于测试,我就没在get的两个方法里面添加判定。

3.在AndroidManifest.xml文件里面添加服务即可

代码:

        <service
            android:name="com.ffcs.aidl.GIMService"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.GIMService" />
            </intent-filter>
        </service>

至此,自己的软件 设置算是完全完成了。

在下面是 第三方软件需要加入的东西设置了。

1.将自己软件里面新建出来的xxx.AIDL文件拷贝出来,让第三方软件放进自己的软件。

拷贝的话建议是把整个aidl文件夹拷贝到第三方软件内。

放的位置:


拷贝完成后还是需要clean或者rebuild你的项目,为了让AS生成相对应的JAVA文件

没错后就可以进行下一步了。
2.在需要调用的地方开启服务

设置了一个新的test项目在主界面加入了一个按钮

布局图如下

代码如下

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!mBound){
                    startService();
                    Toast.makeText(MainActivity.this,"服务正在重连",Toast.LENGTH_SHORT).show();
                    return;
                }
                if (manager == null) return;
                try {
                    String name = manager.getName("");
                    String pwd = manager.getPwd("");
                    Log.e("账号",name);
                    Log.e("密码",pwd);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void startService(){
        Intent intent = new Intent();
        intent.setAction("android.intent.action.GIMService");
        intent.setPackage("com.ffcs.stb");
        bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStart() {
        super.onStart();
        if (!mBound){
            startService();
        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        if (mBound){
            unbindService(mServiceConnection);
            mBound = false;
        }
    }

    private GetInformationManager manager = null;
    //默认未连接服务
    private boolean mBound = false;

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            manager = GetInformationManager.Stub.asInterface(service);
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mBound = false;
        }
    };
}

至此第三方的项目就可以获取数据了。

运行结果如下:


 

最后说下注意点吧。

1.    5.0之后隐式Intent 需要设置活动和包名,不然会错误

2.    创建和拷贝.AIDL文件之后需要重建下项目  不然不会生成相应的JAVA文件,导致写服务一直点不出来

3.    还有就是  需要你软件开启之后,第三方软件才可以获取服务从而获取数据

最后是,我直接用项目写的,源码可能就没办法发了!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值