Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 560|回复: 0

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

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-11 15:21:39 | 显示全部楼层 |阅读模式

    转自:http://blog.csdn.net/spencer_hale/article/details/54968092

     

    1.怎样用多进程

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

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

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

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

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

    载Application类的onCreate方法即可。

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

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

     

    2.用多进程的好处

    好处:

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

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

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

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

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

    #坏处:消耗用户的电量。

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

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

     

    3.多进程的缺陷

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

    1)Application的多次重建。

    2)静态成员的失效。

    3)文件共享问题。

    4)断点调试问题。

     

    4.解决方法

    1)针对Application的多次重建:

    在Application的onCreate中获取进程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.xml中android:process标签,这样保证调试状态下是在同一进程中,堆栈信息是连贯的。待调试完成后,再将标签复原。

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-15 10:42 , Processed in 0.065700 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表