注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

罔少年

QQ 332256483

 
 
 

日志

 
 

Android 多进程  

2017-01-16 10:19:00|  分类: android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在以Linux内核的Android系统中,一般一个应用一个进程,默认为AndroidManifest.xml指定的包名进程。

  什么是多进程   Android:process
  • 应用实现多进程需要依赖Android:process这个属性
  • 适用元素:Application, Activity, BroadcastReceiver, Service, ContentProvider
  • 通常情况下,这个属性以“:”开头,表示这个进程是应用私有,无法跨应用
  • 如果该属性以小写字母开头,表示这个进程为全局进程,可以被多个应用公用

android:process示例

<activity android:name=".MusicPlayerActivity" android:process=".music" />

<activity android:mame=".OtherActivity" android:process="droidyue.com" />


  多进程优点
  • 后台执行,例如推送功能,在主应用退出后,使用多进程仍能保证用户接收到信息
  • 增加App可用内存。一个应用内存过大,则就可能被系统kill,那么我就让它跑在2个3个进程中。系统默认分配给应用的内存限制是有进程控制的,所以增加一个进程,也就多一个默认分配内存
  • 减少崩溃,如果子进程崩溃了,不会导致主程序崩溃

多进程缺点
  • 静态变量,同步锁机制,单例模式都会失效,若果需要通信,可以使用ALDL等进程通信方式
  • SQLite等文件共享会冲突
  • 断电调试失效,可以在调试时先去掉android:process
  • application.onCreate()会执行多次

如何写application,通过不同进程初始化不同数据
  1. public class MyApplication extends Application {  
  2.     public static final String TAG = "viclee";  
  3.   
  4.     @Override  
  5.     public void onCreate() {  
  6.         super.onCreate();  
  7.         int pid = android.os.Process.myPid();  
  8.         Log.d(TAG, "MyApplication onCreate");  
  9.         Log.d(TAG, "MyApplication pid is " + pid);  
  10.   
  11.         ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
  12.         List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();  
  13.         if (runningApps != null && !runningApps.isEmpty()) {  
  14.             for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {  
  15.                 if (procInfo.pid == pid) {  
  16.                      if (procInfo.processName.equals("com.example.processtest")) {  
  17.                          Log.d(TAG, "process name is " + procInfo.processName);  
  18.                      } else if (procInfo.processName.equals("com.example.processtest:remote")) {  
  19.                          Log.d(TAG, "process name is " + procInfo.processName);  
  20.                      }  
  21.                 }  
  22.             }  
  23.         }  
  24.     }  
  25. }  

原文 支持原创作者
  评论这张
 
阅读(25)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018