1.開発の背景
開発中に遭遇した問題はこれです。アプリの起動後、アプリケーションはonCreateでネットワークリクエストを送信し、ログを印刷するときに1回だけ印刷しますが、バックグラウンドで2つの接続リクエストを受信します。最初は追加のリクエストがあると思いましたが、デバッグ、ログログ、トーストで1つのログしか出力されず、ログレコードが表示されていました。その後、同僚と話し合い、ファイルファイルを使用して印刷したところ、OnCreateが2回実行されたことがわかりました。
2.問題分析
txtファイルを開き、複数の文字列文字列が印刷されていることを確認します。話し合いの結果、プロセスの開始時にはOnCreateである必要があることがわかりました。これにより、複数の実行が発生します。まとめ説明:各プロセスはアプリケーションオブジェクトに対応しているため、アプリケーションが複数のプロセスで構成されている場合、アプリケーションオブジェクトのonCreateメソッドが複数回実行されるため、ポーリングが有効になっている場合、またはアプリケーションで大量のデータが初期化されている場合onCreateメソッド、実際には、区別する必要があります
3.加工方法
各プロセスはアプリケーションオブジェクトに対応しているため、リソースの浪費を避けるために、アプリケーションでプロセスの名前を使用して、ロードする必要のあるリソースを区別し、それらの特定のロジックを実行できます。
例1:コード:
@Override
public void onCreate() {
super.onCreate();
//对网络连接的重复连接处理
String processName = OsUtil.getProcessName(this, android.os.Process.myPid());
Log.e("processName", "进程名字:" + processName + "/");
if (processName != null) {
boolean defaultProcess = processName.equals("cn.bql.vehiclemounted.vehiclemounteds");
if (defaultProcess) {
Log.e("processName", "初始化启动:"+ processName);
//connectionSocket(); //需要初始化的内容或者网络连接等
} else if (processName.contains(":pushcore")) {
Log.e("processName", "??????");
}else if(processName.contains(":leakcanary")){
Log.e("processName", "启动了OOM检测服务");
} else if(processName.contains(":vitamio")){
Log.e("processName", "启动了视频服务");
}
}
// if (Environment.getExternalStorageState().equals(
// Environment.MEDIA_MOUNTED)) {
// try {
//
// // 获取SDcard路径
// File sdCardDir = Environment
// .getExternalStorageDirectory();
//
// // SDCard目录:/mnt/sdcard
// String sdcardPath = sdCardDir.getAbsolutePath();
// System.out.println("sdCardDir.getAbsolutePath()"
// + sdCardDir.getAbsolutePath());
//
// File file = new File(sdCardDir, FILE_NAME);
// // File file = new File(sdcardPath
// // + File.separator + FILE_NAME);
// // 以指定文件创建RandomAccessFile对象
// RandomAccessFile raf = new RandomAccessFile(file, "rw");
// // 将文件记录指针移动最后
// raf.seek(file.length());
// // 输出文件内容
// raf.write(processName.getBytes()); //打印进程名字
// raf.close();
//
// } catch (Exception e) {
// // TODO: handle exception
// }
// }
}
上記はonCreateのコードであり、以下はツールクラスです。
import android.app.ActivityManager;
import android.content.Context;
import java.util.List;
/**
* Created by Administrator on 2017/2/14.
* 获得进程名字的方法
*/
public class OsUtil {
public static String getProcessName(Context cxt, int pid) {
//获取ActivityManager对象
ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
//在运行的进程的
List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
return null;
}
}
例2:Rongyun Chatは最近の開発に統合されており、そのsdkソースコードを観察すると、複数のプロセスが使用されていることがわかります。これにより、アプリケーションのonCreateメソッドが複数回実行され、時間が無駄になります。ソリューションが投稿されます。下
onCreateメソッドは次のように記述されます。
@Override
public void onCreate() {
super.onCreate();
initIm();
String processName = getCurProcessName(this);
if (!TextUtils.isEmpty(processName)) {
boolean defaultProcess = processName.equals("你的包名");
if (defaultProcess) {
//当前应用的初始化
initBug();
initApp();
}
}
}
現在のプロセスの名前を取得します
/**
* 获得当前进程的名字
*
* @param context
* @return 进程号
*/
public static String getCurProcessName(Context context) {
int pid = android.os.Process.myPid();
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningAppProcessInfo appProcess : activityManager
.getRunningAppProcesses()) {
if (appProcess.pid == pid) {
return appProcess.processName;
}
}
return null;
}
————————————————
参照:アプリケーションのonCreateメソッドが複数回呼び出される問題
転載:https://blog.csdn.net/true_maitian/article/details/55101477