Android单应用开多进程与单进程跑多应用

一、Android应用多进程
正常情况下,一个apk启动后只会运行在一个进程中,其进程名为AndroidManifest.xml文件中指定的应用包名,所有的基本组件都会在这个进程中运行。但是如果需要将某些组件(如Service、Activity等)运行在单独的进程中,就需要用到Android:process属性了。我们可以为android的基础组件指定process属性来指定它们运行在指定进程中。多进程能突破单进程内存大小的控制,防止OOM。
        
对process属性的设置有两种形式:        第一种形式如android:process=":remote",以冒号开头,冒号后面的字符串原则上是可以随意指定的。如果我们的包名为“com.example.processtest”,则实际的进程名为“com.example.processtest:remote”。 这种设置形式表示该进程为当前应用的私有进程,其他应用的组件不可以和它跑在同一个进程中。
        第二种情况如 android:process="com.example.processtest.remote",以小写字母开头,表示运行在一个以这个名字命名的全局进程中,其他应用通过设置相同的ShareUID可以和它跑在同一个进程。


由于新开启进程,所以需注意下面两点:
1)Application的多次重建。
2)静态成员的失效。

//举例
...
<service
            android:name=".MyService"
            android:label="@string/title_activity_main" 
            android:process="xxx.service">
        </service>
...


二、多应用程序跑同一进程
http://blog.csdn.net/dyllove98/article/details/8836412
http://blog.csdn.net/yanjianjunaaa/article/details/13095087
供参考


使用方法
1、首先在两个程序的Manifest文件中的manifest节点下面设置相同的sharedUserId,比如: android:sharedUserId="com.test"
2、在需要获取数据的程序中创建另外一个程序的上下文引用Context,
Context context = createPackageContext("com.excellence.weather", Context.CONTEXT_IGNORE_SECURITY);其中的第一个参数是另外一个程序的包名,这样就可以利用这个Context像访问自己程序的资源一样访问被共享的程序的资源,例如:
SharedPreferences sharedPreferences = context.getSharedPreferences(SHAREDPREFERENCES_USERINFO, Context.MODE_WORLD_READABLE);
3、导出成apk的时候使用相同的签名

ResourceId 共享方法
1、使用SharedPreferences传递
2、使用相同的资源名

三、获取应用程序开启进程个数及进程名
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
// 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程
List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager.getRunningAppProcesses();

ActivityManager.RunningAppProcessInfo类
说明: 封装了正在运行的进程信息
常用字段 :
  int   pid    进程ID
  int   uid    进程所在的用户ID
  String   processName 进程名,默认是包名或者由android:process=””属性指定
  String [ ]    pkgList       运行在该进程下的所有应用程序包名


List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序

ApplicationInfo类
说明: 应用程序相关信息
常用字段方法 :
  String   packageName 应用名
  String   packageName 应用包名
  String   loadLabel() 获取应用标签
  String   loadIcon() 获取应用图标
  
  
获取当前运行的应用程序开启的进程列表:
1、获得系统里正在运行的所有进程
2、根据进程的pkgList列表里所有包名,在安装的应用目录下查询
3、根据查询到的应用,得到标签图标等
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值