Android 多进程:一般情况下,一个应用程序就是一个进程,进程名就是应用程序的包名。进程是系统分配资源的基本单位,每个进程都有自己独立的资源和内存空间。
1 Android 开启多进程的原因
- 单进程分配的内存不够,需要更多的内存。 早期的 Android 系统只为一个单进程的应用分配了 16MB 的可用内存,随着手机硬件的提升和 Android 系统的改进,虽然可分配的内存越来越多,但仍然可以通过开启多进程来获取更多内存来处理自己的 APP 业务;
- 进程之间相互监视,如果有进程被杀或者崩溃,另外的进程可以重新启动它;
- 一个进程退出了,另外的进程仍然可以工作,比如说推送服务,只要负责推送消息的进程没有退出,仍然能推送消息;
2 开启多进程
在 AndroidManifest.xml 中配置 android:process:
- 第一种:如 android:process = “:remote”,以 : 开始,后面的字符串是可以随意指定的。如果包名是 com.cah.androidtest,所以实际进程名是 com.cah.androidtest:remote。这种设置形式表示该进程为当前应用的私有进程,其他应用的组件不可以和它跑在同一进程中
- 第二种:如 android:process = “com.cah.androidtest.remote”,以小写字母开头,表示运行在一个以这个名字命名的全局进程中,其他应用的组件可以和它跑在同一进程中(使用 SharedUID,且签名一致),从而减少资源的占用。
首先在 Activity 中启动一个服务:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent myServiceIntent = new Intent(MainActivity.this, MyService.class);
startService(myServiceIntent);
}
}
public class MyService extends Service {
private static final String TAG = "MyService";
@Override
public void onCreate() {
Log.e(TAG, "onCreate ");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand: ");
return START_STICKY;
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: ");
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
然后在 AndroidManifest.xml 中配置 android:process 就可以了:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cah.androidtest">
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.AndroidTest">
<activity android:name=</