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

来源:互联网 发布:mac什么输入法最好用 编辑:程序博客网 时间:2024/06/06 01:27

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

参考的文章  


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


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

2 0
原创粉丝点击