美文网首页
【20】多进程

【20】多进程

作者: 嗟嗟嗟 | 来源:发表于2016-07-12 09:37 被阅读0次

一、什么是多进程

如果android系统相当于一个大的工厂,那进程就是工厂中的一个车间,线程是车间中的流水线。

二、为什么要使用多进程

使用多进程的好处是可以扩展程序的内存空间(因为一个进程占用系统内存空间是有限的),增加程序的流畅性,但也可能造成程序过于臃肿,而且进程之间是完全隔离的,可有效杜绝一些安全问题。

三、如何使用?

<service android:name=".MessengerService"
    android:process="com.messenger.service"
    android:enabled="true"
    android:exported="true"
    />

一般通过android:process关键字在manifests文件中定义,程序默认的进程是包名,如果使用:+ xxxx的形式来定义新进程,则会形成包名+: + xxxxx的新进程。

四、进程间的通信

1、使用Messenger传递信息

对于单线程的多进程之间通信,可使用messenger来通信,因为他不会锁定线程,所以是非安全的,但如果是单线程多进程就无所谓了。

下面是一个服务类的代码。

public class MessengerService extends Service {

    private Messenger messenger;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            Log.i("info","MessengerService");
            Message replayMsg = Message.obtain();
            try {
                msg.replyTo.send(replayMsg);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    };

    @Override
    public void onCreate() {
        super.onCreate();
        messenger = new Messenger(handler);
    }





    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return messenger.getBinder();
    }
}

首先自定义一个类,记得在manifests中注册为新的进程,新建一个Messenger类给他传入handler,然后在onBind方法中传入messenger.getBinder()。

然后是主进程代码:

public class MainActivity extends AppCompatActivity {


    private Messenger messenger;
    private Button button;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Log.i("info","MainActivity-handler");

        }
    };

    private Messenger replayMessenger = new Messenger(handler);

    private ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            messenger = new Messenger(iBinder);
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.main_button);

        bindService(new Intent(this,MessengerService.class),serviceConnection, Context.BIND_AUTO_CREATE);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(messenger!=null){
                    Message msg = Message.obtain(handler,0);
                    msg.replyTo = replayMessenger;
                    try {

                        messenger.send(msg);
                        Log.i("info","MainActivity");
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }
                }
            }
        });



    }
}

跟服务中的方法类似,可以通过绑定服务得到service传过来的Messenger,再通过Messenger的send方法传递数据。还可以携带用一个新的Messenger传入自己的handler用来让service给main方法回传数据。

PS:bindService()方法完成绑定需要一段时间,此时是无法获得Messenger的,其次是send方法无法直接传递包括String在内的没有序列化的数据,如果要传递可使用Bundle类

2、使用ALDI传递信息

没怎么用过。。有使用经验后再来补。。

相关文章

  • python并发编程--单进程多线程多进程协程性能对比

    场景单进程,两线程,两进程,两协程 数20万的场景对比单进程:单个进程count 20万两线程:启动两个线程,对全...

  • UNIX基础--进程和守护进程

    进程和守护进程 Processes and Daemons 进程(Processes) FreeBSD 是一个多任...

  • 【20】多进程

    一、什么是多进程 如果android系统相当于一个大的工厂,那进程就是工厂中的一个车间,线程是车间中的流水线。 二...

  • rsync服务企业应用

    守护进程服务企业应用: 守护进程多模块功能配置 守护进程的排除功能实践 守护进程来创建备份目录 守护进程的访问控制...

  • day20-进程管理-笔记

    Day20-进程管理 导读 今日内容1.什么是进程2.程序与进程之间有什么区别3.进程的生命周期4.进程运行的状态...

  • 几个题目

    一、进程 1、 2、 3、 答案: 4、不止创建20个子进程,子进程还会再创建 5、有点不太清楚…… 6、原判断条...

  • Nginx 的进程结构,你明白吗?

    Nginx 进程结构 这篇文章我们来看下 Nginx 的进程结构,Nginx 其实有两种进程结构: 单进程结构 多...

  • 进程/线程

    进程和线程 多任务的介绍 进程的介绍 多进程完成多任务 获取进程编号 进程的注意点 文件夹高并发copy器 1、多...

  • 多易日记进程

    10.29 解决移动端适配问题:采用手淘写的lib-flexible解决移动端的适配,采用pxToRem解决px转...

  • 使用ipc为 electron 实现一个无用的通信轮子

    入门学习electron时了解到,渲染进程与主进程存在一对多的关系, 渲染进程与主进程需要通过ipc或remote...

网友评论

      本文标题:【20】多进程

      本文链接:https://www.haomeiwen.com/subject/xlgjjttx.html