Android 운영 – app 업데이트 업그레이드

7869 단어
전체 절차는 세 단계로 나뉜다.버전 테스트 2.새 apk 파일 다운로드 3.덮어쓰기 설치의 기본 절차는 이렇다. 어떻게 배정하고, 어떤 전략으로 업데이트하는지에 따라 다르다.인터넷의 사고방식은 기본적으로 홈페이지에서 apk버전을 검사하고 업데이트가 필요하면 대화상자를 쳐서 사용자에게 업데이트를 알리는 것이다.사용자가 업데이트를 확정하면 홈페이지에 서비스를 개설하거나download 관리자를 이용하여 파일을 다운로드하여 방송 등록을 하고 다운로드를 마치면 방송에 자동 설치를 한다(download 관리자가 다운로드를 마치면 방송을 보낸다).실제 프로젝트에서 버전 유지 보수의 비용을 고려하여 업데이트 전략은 사용자에게 업데이트를 강제로 선택한다.구체적인 방법은 앱스토어의 자동 설치와 유사하다. 업데이트가 있으면 백엔드에서 다운로드하고 다음에 팝업 대화상자를 열어 설치한다.
하나.버전 체크
사고방식은 일반적으로 최신 버전 정보는 json 파일의 형식으로 서버에 놓여 있다. 우리가 해야 할 일은 OKhttp3을 이용하여 이 json 파일을 다운로드하고 대응하는 필드를 분석하여 로컬 버젼Name과 비교하는 것이다. 다르면 다음 단계로 넘어가는 것이다.OKhttp3 안드로이드 OkHttp 완전 해석
PackageManager packageManager = getPackageManager();
#0 means all the flags are turned off
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
String version = packageInfo.versionName;

둘.새 apk 파일 다운로드
Google이 추천하는 Download Manager를 사용해서 비동기적으로 다운로드할 수 있습니다.
//  ,         , uri        ,    Uri.parse("http://")   Uri  
DownloadManager.Request req = new DownloadManager.Request(uri);

//  setAllowedNetworkTypes                
req.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);

//                       ,           ,
//                 。          
//req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//         
req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);

//            ,                    。
// setDestinationUri
// setDestinationInExternalPublicDir
req.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, title);

//           
//req.setTitle("Android.apk");
//req.setDescription("         ");
req.setMimeType("application/vnd.android.package-archive");

//        ,   downloadmanager    ,                
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
long downloadId = dm.enqueue(req);

다운로드의 기본 설정은 바로 이렇다. 여전히 매우 간단하고 성능이 비교적 높다.실제 사용에서 우리가 더욱 관심을 가져야 할 것은 다운로드 전의 준비 작업과 다운로드 후의 뒷처리 작업이다.다운로드 전의 준비 작업은 우선, 나의 요구는 새로운 버전이 있다는 것을 발견하고, 먼저 다운로드하고, 다운로드가 끝난 후에 사용자가 다시 소프트웨어를 켜서 업데이트 작업을 할 때까지 기다리는 것이다.그래서 여기에 최신 소프트웨어 패키지가 다운로드되었는지 아닌지를 판단하는 논리적 판단이 있다. 없으면 다운로드하고 만약에 이미 설치 단계에 들어갔다면.
 /**
     *   APK  
     *
     * @param context
     * @param url
     * @param info
     * @param appName
     */
    public void downloadApk(MainActivity mainActivity, final Context context, String url, String info, final String appName) {
        //       ID
        long downloadId = (long) SPUtil.get(context, DownloadManager.EXTRA_DOWNLOAD_ID, -1L);
        if (downloadId != -1) {
            //      
            int status = getDownloadStatus(downloadId);
            //       
            if (DownloadManager.STATUS_SUCCESSFUL == status) {
                //      URI
                final Uri downloadUri = getDownloadUri(downloadId);
                if (downloadUri != null) {
                    //     APK,    APK  ,      。     ,    。
                    //    ......
                        return;
                    } else {
                        //          
                        mDownloadManager.remove(downloadId);
                    }
                }
                start(context, url, info, appName);
            } else if (DownloadManager.STATUS_FAILED == status) {
                //    ,    
                start(context, url, info, appName);
            } else {
                Log.d(context.getPackageName(), "apk is already downloading");
            }
        } else {
            //   downloadId,     APK
            start(context, url, info, appName);
        }
    }

위 코드는 다운로드 파일을 가져오고 다운로드 상태를 판단하는 작업과 관련된download 관리자와 관련이 있습니다.
//      
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor c = dm.query(query);
if (c != null) {
    if (c.moveToFirst()) {
        String fileUri = c.getString(c.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI));
        // TODO             
    }
    c.close();
}

//      
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
Cursor c = dm.query(query);
if (c != null && c.moveToFirst()) {
    int status = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
    switch (status) {
        case DownloadManager.STATUS_PENDING:
            break;
        case DownloadManager.STATUS_PAUSED:
            break;
        case DownloadManager.STATUS_RUNNING:
            break;
        case DownloadManager.STATUS_SUCCESSFUL:
            break;
        case DownloadManager.STATUS_FAILED:
            break;
}
if (c != null) {
    c.close();
}

물론 다운로드하기 전에 다운로드할 수 있는지 없는지를 판단해야 한다. 와이파이가 켜졌는지, 켜지지 않았는지 핸드폰 설정 페이지로 이동한다.
    public boolean canDownload() {
        try {
            int state = mContext.getPackageManager().getApplicationEnabledSetting("com.android.providers.downloads");
            if (state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED
                    || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER
                    || state == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED) {
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    public void skipToDownloadManager() {
        String packageName = "com.android.providers.downloads";
        Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
        intent.setData(Uri.parse("package:" + packageName));
        mContext.startActivity(intent);
    }

다운로드 후 뒷수습이 끝나면download 관리자가 Download 관리자를 보냅니다.ACTION_DOWNLOAD_COMPLETE 방송을 하고 downloadId를 매개 변수로 전달하면 우리는 라디오 수신기를 사용자 정의하여 이 방송을 수신하여 자동 설치를 완성할 수 있다.그러나 여기서 우리는 앱을 다시 켜서 설치하기 때문에 이 방송 기능을 사용할 수 없다.하지만 여기서 우리가 해야 할 일은 설치가 끝난 후에 apk 파일을 삭제하는 것이다. 비록 많은 휴대전화들이 자동으로 설치한 후에 삭제할 수 있지만 혹시 모르니까.이 삭제 판단은 다운로드 파일 앞에 두십시오. 논리는 apk 파일이 존재하고 설치되어 있으면 삭제합니다.
    public void removeFile(Context context) {
        //       ID
        long downloadId = (long) SPUtil.get(context, DownloadManager.EXTRA_DOWNLOAD_ID, -1L);
        if (downloadId != -1) {
            //    mDownloadManager.remove(downloadId)      ;
            Uri filePath = getDownloadUri(downloadId);
            if (filePath != null) {
                //                ,      ,         versionCode
                if (!compare(getApkInfo(context, filePath.getPath()), context)) {
                    File downloadFile = new File(filePath.getPath());
                    if (null != downloadFile && downloadFile.exists()) {
                        downloadFile.delete();
                    }
                }
            }
        }
    }

셋.설치 덮어쓰기
사고방식은 마지막으로 덮어쓰고 설치한 것이다. 어떤 전략을 선택했는지 보자. 나는 사용자가 거절할 수 없는 대화상자를 직접 꺼내서 업데이트를 시켜 후기 유지보수 비용을 절약하도록 한다.
    if (compare(getApkInfo(context, downloadUri.getPath()), context)) {
        AlertDialog.Builder builder = new AlertDialog.Builder(mainActivity);
        builder.setTitle("       !");
        builder.setMessage(info);
        builder.setCancelable(false);
        builder.setPositiveButton("    ", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                startInstall(context, downloadUri);
            }
        });
        mAlertDialog = builder.create();
        handler.sendEmptyMessageDelayed(0, 1000);

좋은 웹페이지 즐겨찾기