您的位置:首页 > 移动开发 > Android开发

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

2016-06-02 18:05 483 查看
一、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、根据查询到的应用,得到标签图标等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: