一、进程概念
进程就像一个车间,线程就像一条流水线
进程是线程的容器
一个进程里,资源是所有线程共享的
一个进程实际是程序的抽象
在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