Android 운영 – app 업데이트 업그레이드
하나.버전 체크
사고방식은 일반적으로 최신 버전 정보는 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);
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.