【20】多进程

一、什么是多进程

如果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传递信息

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,385评论 25 709
  • java 接口的意义-百度 规范、扩展、回调 抽象类的意义-乐视 为其子类提供一个公共的类型封装子类中得重复内容定...
    交流电1582阅读 2,326评论 0 11
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,246评论 19 139
  • 文/阿夏丽 如果你也还记得 曾经 我们在一起时 那些青涩的日子 那么 现在回想起来 会不会如同一杯温热的茶 带着丝...
    阿夏丽阅读 317评论 1 3
  • 1.记忆第三组自己的超级记忆宫殿!! ⥤你的办公室或者学校(从门口开始,顺时针或逆时针,写20项) 1门、2藤椅、...
    初来乍到的coco辣阅读 288评论 1 1