android:process引发的血案
2020-03-19 本文已影响0人
萝卜小青菜丶
首先贴一段比较常用的代码,相信有一定开发经验的人,都能看明白这个配置是做了什么。
<service
android:name=".service.LogService"
android:exported="true"
android:process=":LogService" />
上面配置的service是在另一个进程中启动,但这样会有一个问题,开启多进程会使Application运行两次,下面做个试验,继承Application,在oncreate方法中打log并运行程序
public class MyApplication extends Application {
private static final String TAG = "jf";
@Override
public void onCreate() {
super.onCreate();
int pid = android.os.Process.myPid();
Log.i(TAG, "MyApplication is oncreate====="+"pid="+pid);
}
在log中发现我们开启的两个进程都会执行oncreate方法。现在很多人都习惯在Application中做初始化操作以及数据的传递操作,显然我也见这么干过的,把库初始化了两次。
当然,知道问题就好解决,方法就是得到每个进程的名称,如果进程的名称和我们应用的进程名称相同则做我们应用的操作,如果不是则做其他进程的操作,以下方法仅供参考:
@Override
public void onCreate() {
super.onCreate();
// 获取当前包名
String packageName = getPackageName();
// 获取当前进程名
String processName = getProcessName(android.os.Process.myPid());
if (processName == null || processName.equals(packageName)) {
//todo:
}
}
/**
* 获取进程号对应的进程名
*
* @param pid 进程号
* @return 进程名
*/
private static String getProcessName(int pid) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
String processName = reader.readLine();
if (!TextUtils.isEmpty(processName)) {
processName = processName.trim();
}
return processName;
} catch (Throwable throwable) {
throwable.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException exception) {
exception.printStackTrace();
}
}
return null;
}