Android 는 어떻게 앱 자동 업 데 이 트 를 실현 합 니까
안 드 로 이 드 사용자 에 게 핸드폰 앱 시장 은 날 아 다 닌 다 고 해도 과장 되 지 않 습 니 다.예 를 들 어 샤 오미,매력 족,바 이 두,360,기봉,애플 리 케 이 션 등 이 있 습 니 다.우리 가 새로운 버 전의 앱 을 출시 하려 고 할 때 채널 포장 의 번 거 로 움 은 물론 이 고 앱 을 각 시장 에 올 리 는 업 무량 도 많 습 니 다.어렵 게 우 리 는 앱 을 모두 올 렸 습 니 다.갑자기 애플 리 케 이 션 이 반 짝 이 는 작은 bug 를 발 견 했 습 니 다.이때 그 붕 괴 는 크게 바 뀌 지 않 았 습 니 다.우 리 는 각 애플 리 케 이 션 시장의 버 전 을 다시 올 려 서 업데이트 해 야 합 니까?나 를 믿 어.운영 진 이 널 죽 일 거 야!!
문제 가 생기 면 자 연 스 럽 게 문 제 를 해결 할 방안 이 생기 기 때문에 앱 에 자동 으로 업데이트 되 는 기능 을 삽입 하면 많은 번 거 로 움 을 줄 일 수 있다 는 생각 이 든다.물론 이 기능 에 관 한 제3자 SDK 는 많다.
자,본론 으로 들 어가 자.오늘 우리 스스로 앱 에 대한 자동 업 데 이 트 를 실현 하 자.
절차 가 복잡 하지 않 습 니 다.사용자 가 앱 을 열 었 을 때 저 희 는 앱 에 검사 버 전의 네트워크 요청 을 보 내 거나 서버 에서 앱 에 알림 메 시 지 를 보 내 서 앱 의 버 전 을 검사 하 라 고 합 니 다.만약 에 현재 앱 버 전이 서버 에 있 는 것 보다 오래 되면 저 희 는 사용자 에 게 업데이트 앱 을 다운로드 하 라 고 일 깨 워 줍 니 다.물론 특정한 상황 에서우 리 는 또한 사용 자 를 강제로 업그레이드 시 킬 수 있다.물론 이것 은 매우 우호 적 이지 않 고 가능 한 한 이런 방법 을 줄 일 수 있다.
자,절 차 를 정리 하 겠 습 니 다.먼저 APP 의 업데이트 인 이상 우 리 는 새로운 APP 를 다운로드 해 야 합 니 다.그리고 우 리 는 사용자 에 게 현재 의 다운로드 진 도 를 알려 주 는 알림 이 필요 합 니 다.그리고 APP 설치 패키지 다운로드 가 완 료 된 후에 우 리 는 시스템 의 설치 프로그램 에 가서 APP 를 설치 하고 업데이트 해 야 합 니 다.
지식 포인트:
다운로드:비동기 HTTP 에서 파일 다운 로드 를 요청 하고 현재 다운로드 진 도 를 감청 합 니 다(여기 서 okhttp 을 사 용 했 습 니 다)
알림:알림(구체 적 인 용법 은 API 문 서 를 스스로 뒤 져 보십시오)
설치:Intent(구체 적 인 용법 은 API 문 서 를 스스로 뒤 져 보십시오)
구체 적 인 실현 코드 를 살 펴 보 자.
우 리 는 앱 의 다운 로드 를 지탱 하기 위해 백 스테이지 서비스 가 필요 하 다.
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.support.v7.app.NotificationCompat;
import com.fangku.commonlibrary.utils.StorageUtil;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.callback.FileCallBack;
import java.io.File;
import okhttp3.Call;
/**
* apk
* Create by: chenwei.li
* Date: 2016-08-14
* time: 09:50
* Email: [email protected]
*/
public class DownloadService extends Service {
private String mDownloadUrl;//APK
private NotificationManager mNotificationManager;
private Notification mNotification;
@Override
public void onCreate() {
super.onCreate();
mNotificationManager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent == null) {
notifyMsg(" ", " ", 0);
stopSelf();
}
mDownloadUrl = intent.getStringExtra("apkUrl");// APK
downloadFile(mDownloadUrl);// APK
return super.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
private void notifyMsg(String title, String content, int progress) {
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);// , v7 NotificationCompat
builder.setSmallIcon(R.mipmap.icon_login_logo).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.icon_login_logo)).setContentTitle(title);
if (progress > 0 && progress < 100) {
//
builder.setProgress(100, progress, false);
} else {
builder.setProgress(0, 0, false);
}
builder.setAutoCancel(true);
builder.setWhen(System.currentTimeMillis());
builder.setContentText(content);
if (progress >= 100) {
//
builder.setContentIntent(getInstallIntent());
}
mNotification = builder.build();
mNotificationManager.notify(0, mNotification);
}
/**
* apk
*
* @return
*/
private PendingIntent getInstallIntent() {
File file = new File(StorageUtil.DOWNLOAD_DIR + "APP ");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://" + file.getAbsolutePath()), "application/vnd.android.package-archive");
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return pendingIntent;
}
/**
* apk
*
* @param url
*/
private void downloadFile(String url) {
OkHttpUtils.get().url(url).build().execute(new FileCallBack(StorageUtil.DOWNLOAD_DIR, "APP ") {
@Override
public void onError(Call call, Exception e, int id) {
notifyMsg(" ", " ", 0);
stopSelf();
}
@Override
public void onResponse(File response, int id) {
//
notifyMsg(" ", " ", 100);
stopSelf();
}
@Override
public void inProgress(float progress, long total, int id) {
//progress*100 ,total
if ((int) (progress * 100) % 10 == 0) {
// View, 10%
notifyMsg(" ", " ..", (int) (progress * 100));
}
}
});
}
}
그 다음 에 저 희 는 저희 가 원 하 는 앱 을 업데이트 할 때 이 서 비 스 를 바 꾸 면 됩 니 다.예 를 들 어 시스템 설정 에 있 는'버 전 검사'등 입 니 다.
Intent intent = new Intent(mContext, DownloadService.class);
intent.putExtra("apkUrl", "APK ");
startService(intent);
총결산여기 서 저 는 로 컬 에서 앱 을 자동 으로 업데이트 하 는 기능 을 대충 보 여 주 었 을 뿐 입 니 다.실제 응용 프로그램 에서 저 희 는 서비스 측 에 협조 하여 해 야 합 니 다.예 를 들 어 사용자 가 앱 을 시작 할 때 버 전 번 호 를 비교 해 야 합 니 다.만약 에 버 전 번호 가 서버 의 버 전 번호 보다 낮 으 면 이때 서비스 측 에서 클 라 이언 트 에 게 전송 해 야 합 니 다.이곳 의 전송 내용 은 새로운 버 전 APP 의 다운로드 주소 여야 합 니 다.이때 이 주소 에 따라 새 앱 을 다운로드 할 수 있 습 니 다.중대 한 업데이트 가 발생 하여 기 존 버 전 을 호 환 하지 않 을 때 사용자 업 그 레이 드 를 강제 할 수 있 습 니 다.여기 에는 시스템 급 대화 상 자 를 호출 하여 사용자 가 취소 할 수 없 게 하 는 등 작업 이 많 습 니 다.여기 서 더 이상 설명 하지 않 습 니 다.이상 이 이 글 의 전체 내용 이 니 필요 한 사람 에 게 도움 이 되 었 으 면 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.