Android开发中怎样用多进程、用多进程的好处、多进程的缺陷、解决方法

来源:互联网 发布:cos图片特效软件 编辑:程序博客网 时间:2024/06/05 19:01

1.怎样用多进程

Android多进程概念一般情况下一个应用程序就是一个进程这个进程名称就是应用程序包名我们知道进程是系统分配资源和调度的基本单位所以每个进程都有自己独立的

资源和内存空间别的进程是不能任意访问其他进程的内存和资源的

如何让自己的应用拥有多个进程

四大组件在AndroidManifest文件中注册的时候有个属性android:process这里可以指定组件的所处的进程

默认就是应用的主进程指定为别的进程之后系统在启动这个组件的时候就先创建如果还没创建的话这个进程然后再创建该组件打印出它的进程名称

Application类的onCreate方法即可

设置android:process属性要注意如果是android:process=:deamon:开头的名字表示这是一个应用程序的私有进程否则它是一个全局进程私有进程的进程名称是

会在冒号前自动加上包名而全局进程则不会一般我们都是有私有进程很少使用全局进程


2.用多进程的好处

好处:

(1)分担主进程的内存压力

当应用越做越大内存越来越多将一些独立的组件放到不同的进程它就不占用主进程的内存空间了当然还有其他好处有心人会发现

(2)使应用常驻后台,防止主进程被杀守护进程守护进程和主进程之间相互监视有一方被杀就重新启动它

Android后台进程里有很多应用是多个进程的因为它们要常驻后台特别是即时通讯或者社交应用不过现在多进程已经被用烂了

典型用法是在启动一个不可见的轻量级私有进程在后台收发消息或者做一些耗时的事情或者开机启动这个进程然后做监听等

#坏处:消耗用户的电量

            多占用了系统的空间,若所有应用都这样占用,系统内存很容易占满而导致卡顿

            应用程序架构会变得复杂,因为要处理多进程之间的通信这里又是另外一个问题了


3.多进程的缺陷

进程间的内存空间是不可见的开启多进程后会引发以下问题

1Application的多次重建

2静态成员的失效

3文件共享问题

4断点调试问题


4.解决方法

1)针对Application的多次重建:

ApplicationonCreate中获取进程Id来判断不同进程,然后做不同的事情。

public class MyApplication extends Application {

@Override

public void onCreate() {

super.onCreate();

//获取进程Id

int pid = android.os.Process.myPid();

Log.e("m_tag", "MyApplication onCreate pid is " + pid); //根据进id获取进程名称

String pName = getProcessName(this,pid);

if("com.xyy.processtest".equals(pName)){

//处理该进程的业务

}

}

}

public String getProcessName(Context cxt, int pid) {

ActivityManager am = (ActivityManager)

cxt.getSystemService(Context.ACTIVITY_SERVICE);

List<RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();

if (runningApps == null) {

return null;

}

for (RunningAppProcessInfo procInfo : runningApps) {

if (procInfo.pid == pid) {

return procInfo.processName;

}

}

return null;

}

2)针对静态成员的失效

使用Intent或者aidl等进程通讯方式传递内容,不能用静态或单例模式。

3)针对文件共享问题

多进程情况下会出现两个进程在同一时刻访问同一个数据库文件的情况这就可能造成资源的竞争访问导致诸如数据库损坏数据丢失等在多线程的情况下我们有锁机制控制资源的共享但是在多进程中比较难虽然有文件锁排队等机制但是在Android里很难实现解决办法就是多进程的时候不并发访问同一个文件比如子进程涉及到操作数据库就可以考虑调用主进程进行数据库的操作

4针对断点调试问题

调试就是跟踪程序运行过程中的堆栈信息由于每个进程都有自己独立的内存空间和各自的堆栈无法实现在不同的进程间调试因此要改为同一进程调试时去掉AndroidManifest.xmlandroid:process标签这样保证调试状态下是在同一进程中堆栈信息是连贯的待调试完成后再将标签复原


0 0
原创粉丝点击