Android:进程间通讯AIDL

简介:

一、适用场景:client进程必须是Activity,服务端进程必须是Service

二、基于:Activity跟Service绑定

三、问题:在Activity中可以得到的Binder对象,但是无法获得具体类型

四、使用步骤:

(一)Service中创建Binder对象

(二)创建aidl文件(接近interface)

1. 在服务端创建一个interface,方法为MyBinder中的方法

2. 把接口文件扩展名修改为“aidl”,并删除interface之前的public修饰符

3. 将aidl文件拷贝到客户端同样包名中

4. 在服务端将MyBinder继承的Binder修改为aidl文件名.Stub

5. 在客户端的onServiceConected()方法中

  通过IMyBinder binder = IMyBinder.Stub.asInterface(service);

  得到binder




服务端service:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import  com.ex03.aidl.IMyBinder;
import  android.app.Service;
import  android.content.Intent;
import  android.os.Binder;
import  android.os.IBinder;
import  android.util.Log;
public  class  MyService  extends  Service
{
     private  String play()
     {
         return  "播放音乐" ;
     }
                      
     private  String pause()
     {
         return  "暂停音乐" ;
     }
                      
     public  class  MyBind  extends  IMyBinder.Stub
     {
         public  String play()
         {
             return  MyService. this .play();
         }
                          
         public  String pause()
         {
             return  MyService. this .pause();
         }
                          
     }
                      
     private  IBinder bind =  new  MyBind();
                      
     @Override
     public  IBinder onBind(Intent intent)
     {
         return  bind;
     }
}


客户端Activity:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import  com.ex03.aidl.IMyBinder; //服务端添加aidl文件后,复制到客户端,并导入包
import  android.os.Bundle;
import  android.os.IBinder;
import  android.os.RemoteException;
import  android.app.Activity;
import  android.content.ComponentName;
import  android.content.Intent;
import  android.content.ServiceConnection;
import  android.util.Log;
import  android.view.Menu;
import  android.view.View;
import  android.view.View.OnClickListener;
import  android.widget.TextView;
public  class  MainActivity  extends  Activity  implements  OnClickListener
{
     IMyBinder bind =  null ;
     TextView textView =  null ;
     private  ServiceConnection conn =  new  ServiceConnection()
     {
         @Override
         public  void  onServiceDisconnected(ComponentName name)
         {
               
         }
           
         @Override
         public  void  onServiceConnected(ComponentName name, IBinder service)
         {
             bind = IMyBinder.Stub.asInterface(service); //通过此方法得到IBinder对象类型
         }
     };
     @Override
     protected  void  onCreate(Bundle savedInstanceState)
     {
         super .onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
           
         findViewById(R.id.btn_client_play).setOnClickListener( this );
         findViewById(R.id.btn_client_pause).setOnClickListener( this );
         findViewById(R.id.button3).setOnClickListener( this );
         textView = (TextView) findViewById(R.id.textView1);
     }
       
     @Override
     public  boolean  onCreateOptionsMenu(Menu menu)
     {
         getMenuInflater().inflate(R.menu.main, menu);
         return  true ;
     }
     @Override
     public  void  onClick(View v)
     {
         switch  (v.getId())
         {
             case  R.id.btn_client_play:
                 btnPlayClick();
                 break ;
             case  R.id.btn_client_pause:
                 btnPauseClick();
                 break ;
             case  R.id.button3:
                 btnBindClick();
                 break ;
             default :
                 break ;
         }
     }
     private  void  btnBindClick() //点击启动服务
     {
         Intent service =  new  Intent( "com.ex03.ipc.aidl" );
         bindService(service , conn, BIND_AUTO_CREATE);
     }
     private  void  btnPauseClick() //点击暂停音乐
     {
         try
         {
             textView.setText(bind.pause());
         }
         catch  (RemoteException e)
         {
             e.printStackTrace();
         }
     }
     private  void  btnPlayClick() //点击播放音乐
     {
         try
         {
             textView.setText(bind.play());
         }
         catch  (RemoteException e)
         {
             e.printStackTrace();
         }
     }
}





本文转自 glblong 51CTO博客,原文链接:http://blog.51cto.com/glblong/1205249,如需转载请自行联系原作者
目录
相关文章
|
iOS开发 MacOS
MacOS环境-手写操作系统-40-进程消息通讯 和 回车键处理
MacOS环境-手写操作系统-40-进程消息通讯 和 回车键处理
121 2
|
Java Android开发 数据安全/隐私保护
Android中多进程通信有几种方式?需要注意哪些问题?
本文介绍了Android中的多进程通信(IPC),探讨了IPC的重要性及其实现方式,如Intent、Binder、AIDL等,并通过一个使用Binder机制的示例详细说明了其实现过程。
974 4
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
309 1
|
Android开发 开发者 Kotlin
Android 多进程情况下判断应用是否处于前台或者后台
本文介绍在多进程环境下判断Android应用前后台状态的方法。通过`ActivityManager`和服务信息`RunningAppProcessInfo`可有效检测应用状态,优化资源使用。提供Kotlin代码示例,帮助开发者轻松集成。
1168 8
|
算法 Linux 调度
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
849 1
xenomai内核解析--xenomai与普通linux进程之间通讯XDDP(一)--实时端socket创建流程
|
Linux 调度 数据库
|
大数据 Linux Android开发
Android ParcelFileDescriptor实现进程间通信
Android ParcelFileDescriptor实现进程间通信
627 0
|
大数据 Android开发
Android使用AIDL+MemoryFile传递大数据
Android使用AIDL+MemoryFile传递大数据
340 0
|
XML 前端开发 Android开发
Android架构设计——MVC(1),Android多进程从头讲到尾
Android架构设计——MVC(1),Android多进程从头讲到尾
|
Android开发
Android stdio 无法新建或打开AIDL文件(解决方法)
Android stdio 无法新建或打开AIDL文件(解决方法)
1407 0

热门文章

最新文章