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 의 다운로드 주소 여야 합 니 다.이때 이 주소 에 따라 새 앱 을 다운로드 할 수 있 습 니 다.중대 한 업데이트 가 발생 하여 기 존 버 전 을 호 환 하지 않 을 때 사용자 업 그 레이 드 를 강제 할 수 있 습 니 다.여기 에는 시스템 급 대화 상 자 를 호출 하여 사용자 가 취소 할 수 없 게 하 는 등 작업 이 많 습 니 다.여기 서 더 이상 설명 하지 않 습 니 다.이상 이 이 글 의 전체 내용 이 니 필요 한 사람 에 게 도움 이 되 었 으 면 합 니 다.

좋은 웹페이지 즐겨찾기