Android 通过AIDL在两个APP之间Service通信

移动开发 作者: 2024-08-24 15:30:01
一、项目介绍 【知识准备】 ①Android Interface definition language(aidl,android接口定义语言),其目的实现跨进程的调用。进程是程序在os中执行的载体,

一、项目介绍

二、首先介绍一个App之间的Service和Activity之间的通信

1 <service
2             android:name=".MyService"
3             android:enabled="true"
4             android:exported="true"></service>
 1 public class MyService extends Service {
 2     public MyService() {
 3     }
 4 
 5     @Override
 6      IBinder onBind(Intent intent) {
 7         return new MyBinder();//return MyBinder通过ServiceConnection在activity中拿到MyBinder
 8  9 
10 11     int onStartCommand(Intent intent,int flags,1)">int startId) {
12 
13         super.onStartCommand(intent,flags,startId);
14 15 
16     public  void  payService(){
17         Log.i("MyService","payService: --------");
18 19 
20     class MyBinder  Binder{
21 
22          pay(){
23             payService();
24         }通过Binder实例将service中的方法暴露出去
25 26 }
1     Button
2         android:id="@+id/btn_paly"
        android:text="Pay"
        android:layout_width="wrap_content"
5         android:layout_height="wrap_content" />
class MainActivity  AppCompatActivity {
 2 
 3     MyService.MyBinder binder = null;
 4     ServiceConnection conn;
 5 
 6  7     protected  onCreate(Bundle savedInstanceState) {
 8         .onCreate(savedInstanceState);
 9         setContentView(R.layout.activity_main);
10 
11         Button btnPlay = (Button) findViewById(R.id.btn_paly);
12         conn = new ServiceConnection() {
13             @Override
14              onServiceConnected(ComponentName componentName,IBinder iBinder) {
15                 binder = (MyService.MyBinder) iBinder;
16             }
17 
19              onServiceDisconnected(ComponentName componentName) {
20 
21 22         };
23 
24         Intent intent = new Intent(MainActivity.this,MyService.class25         bindService(intent,conn,BIND_AUTO_CREATE);开启服务
26 
27         btnPlay.setOnClickListener( View.OnClickListener() {
28 29              onClick(View view) {
30                 if (binder!=){
31                     binder.play();
32                 }
33 34         });
35 36 }

 三、两个App之间的Service通信

①在AppPayProvider中创建MyService

 1          2              3  4 >
 5             <!--enable:ture设置可用
            exported:ture对外暴露 -->
 7             intent-filter 8                 action ="com.xqz.apppayprovider.MyService" />
 9             </10         >

②MainActivity和layout_main保留创建时不作任何修改,但也不要删掉,因为安装程序必须提供起始页面,否则将会出错

③在AppPayProvider中添加AIDL

④再创建好AIDL,添加完方法后,android studio需要对这个aidl进行编译,会自动按aidl规范生成一个Binder子类的代码。

⑤对MyService中的MyBinder进行修改

⑥创建AppPayUser对AppPayProvider中的MyService进行操作

="@+id/btnPay"
="pay"
/>

⑦将AppPayProvider中AIDL拷贝到AppPayUser中

⑧【AppPayUser-MainActivity】

    Button btnPay;
 4     private IPay myBinder;定义AIDL
 6     ServiceConnection conn =  7         @Override
10             myBinder = IPay.Stub.asInterface(iBinder);
11         }
14         17     };
18 
19 21          Intent();
25         intent.setAction("com.xqz.apppayprovider.MyService"26         表示按照什么进行过滤,启动意图
27         /*android5.0之后,如果servicer不在同一个App的包中,
         需要设置service所在程序的包名
29          (包名可以到App的清单文件AndroidManifest中查看)*/
30         intent.setPackage("com.xqz.apppayprovider"31         bindService(intent,1)">开启Service
32 
33         btnPay = (Button) findViewById(R.id.btnPay);
34 
35         btnPay.setOnClickListener(36 37             38                 try {
39                     myBinder.pay();
40                 } catch (RemoteException e) {
41                     因为是跨程序调用服务,可能会出现远程异常
42                     e.printStackTrace();
43 44 45 46 47 }

四、总结

五、园友实践问题

原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
本文链接:http://www.jiecseo.com/news/show_67889.html