「AndroidアプリケーションのonCreateの複数の呼び出しの分析と処理」

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 

おすすめ

転載: blog.csdn.net/weixin_42602900/article/details/123104713