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

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

参考的文章  


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

[AS 2.1.3开发实践] 安卓AIDL的使用_第1张图片

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

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

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

interface GetInformationManager {

    String getName(String packname);

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

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

没错之后再进行下一步。

生成的位置如下

[AS 2.1.3开发实践] 安卓AIDL的使用_第2张图片


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文件里面添加服务即可

代码:

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


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

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

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

放的位置:

[AS 2.1.3开发实践] 安卓AIDL的使用_第3张图片
拷贝完成后还是需要clean或者rebuild你的项目,为了让AS生成相对应的JAVA文件

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

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

布局图如下

[AS 2.1.3开发实践] 安卓AIDL的使用_第4张图片

代码如下

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.    还有就是  需要你软件开启之后,第三方软件才可以获取服务从而获取数据


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

你可能感兴趣的:(程序日记)