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

一、进程概念

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

进程是线程的容器

一个进程里,资源是所有线程共享的
一个进程实际是程序的抽象
 
在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

 

posted @ 2016-04-25 23:34  唐大兵  阅读(226)  评论(0编辑  收藏  举报