第九次笔记分享_进程与服务

本文详细解释了进程的概念,如何在 Manifest 中指定进程,并探讨了在多进程环境下进行通信的方法,包括使用 Messenger 和 AIDL 实现多进程间通信。重点介绍了如何通过 Messenger 实现多线程间的高效通信,以及服务的种类、启动方式和后台/前台的区别。

一、进程概念

进程就像一个车间,线程就像一条流水线

进程是线程的容器

一个进程里,资源是所有线程共享的
一个进程实际是程序的抽象
 
在Manifest里的application或者Activity中加入标签
android:process="com.test"
即创建了一个名字为com.test的独立进程(全局进程)
如果加了冒号,相当于在原进程的空间里附加了一个进程(私有进程)
 
什么情况下使用多进程?
每个进程都有使用内存限制,开辟多了进程可以扩大APP的使用内存,但进程更多更耗电,需要权衡
 
进程见有内存不可见性,所以各个进程之间是相互独立的
 

二、多进程间通信IPC

多进程,单线程
使用Messenger --> 利用Handler
多进程,多线程
使用AIDL(不建议,除非很复杂的应用)
 
使用Messenger实现多进程通信方法:
使用Messenger进行多线程通信
1.首先创建一个MessengerService
 1     public class MessengerService extends Service {
 2 
 3         // 适合于多进程,单线程,不需要考虑线程安全
 4         Messenger mMessenger = new Messenger(new IncomingHandler());
 5 
 6         static class IncomingHandler extends Handler {
 7             @Override
 8             public void handleMessage(Message msg) {
 9                 super.handleMessage(msg);
10                 // 处理消息
11                 switch (msg.what) {
12                     case 0:
13                         // 动作
14                         break;
15                 }
16             }
17         }
18 
19         @Nullable
20         @Override
21         public IBinder onBind(Intent intent) {
22             return mMessenger.getBinder();
23         }
24     }
点击展开

 

 
2.创建一个MessengerActivity
 1     public class MessengerActivity extends Activity {
 2 
 3         private ServiceConnection mServiceConnection = new ServiceConnection() {
 4             @Override
 5             public void onServiceConnected(ComponentName name, IBinder service) {
 6                 mMessenger = new Messenger(service);
 7             }
 8 
 9             @Override
10             public void onServiceDisconnected(ComponentName name) {
11 
12             }
13         };
14         private Messenger mMessenger;
15 
16         @Override
17         protected void onCreate(Bundle savedInstanceState) {
18             super.onCreate(savedInstanceState);
19 
20             bindService(new Intent(this, MessengerService.class), mServiceConnection, Context.BIND_AUTO_CREATE);
21 
22             if (mMessenger != null) {
23                 // 这里可以不发送null,改为发送一个Handler,这样在MessengerService就可以得到这个Handler
24                 // 然后又可以给MessengerActivity发送消息
25                 Message message = Message.obtain(null, 0, "hello");
26                 try {
27                     mMessenger.send(message);
28                 } catch (RemoteException e) {
29                     e.printStackTrace();
30                 }
31             }
32         }
33     }
点击展开

 

 

三、Service小结

按种类
Local:依附在主进程里
Remote:独立的进程
 
按类型
前台:优先级更高,会在通知栏一直显示Notification
后台
 
按启动方式
Start
Bind

 

转载于:https://www.cnblogs.com/tang-tang/p/5433271.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值