まずプロセスを整理しましょう: バージョン番号を決定します—> 現在のバージョン番号より大きいアップデートをします——「アップデートが必要かどうかを尋ねるポップアップ ボックスが表示されます (アップデートを確認します)—“システムの DownloadManager を使用してダウンロードします—”ダウンロードが完了したら、インストールページに移動します——「インストールが完了したらアンインストールしてください」
背後に完全なコードがあります
1. バージョン番号を確認する
最新バージョン情報を取得する
/**
* 获取系统版本号
* */
public String getAppVersionCode(Context context) {
int versioncode = 0;
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
// versionName = pi.versionName;
versioncode = pi.versionCode;
} catch (Exception e) {
Log.e("VersionInfo", "Exception", e);
}
return versioncode + "";
}
次に、それをインターフェイスから返されたバージョンコードと比較し、それがインターフェイスから返されたコードより小さい場合は更新操作を実行します。それ以外の場合は更新は必要ありません
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main10);
if (Integer.parseInt(getAppVersionCode(this))>1){
ShowDialog();
}
}
2. アップデートが必要かどうかを尋ねるポップアップ ボックスが表示されます。
新しいバージョンを見つけた場合、更新されているかどうかを確認するボックスをポップアップ表示できます。このステップでは、美しいポップアップ ボックスをカスタマイズし、[OK] ボタンのモニターにダウンロード ロジックを書き込むことができます。
/**
* 弹框询问是否更新版本
* */
private void ShowDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("有新版本");
builder.setMessage("更新内容");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
getAPK();
}
}); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
}
3. システム DownloadManager を使用してダウンロードします。
ダウンロード方法は、DownloadManager システムを使用して実現されます。これは非常に簡単です。
/**
* 下载apk
* */
public void getAPK(){
DownloadManager mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
String apkUrl = "https://qd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk";
Uri resource = Uri.parse(apkUrl);
DownloadManager.Request request=new DownloadManager.Request(resource);
//下载的本地路径,表示设置下载地址为SD卡的Download文件夹,文件名为mobileqq_android.apk。
request.setDestinationInExternalPublicDir("Download", "mobileqq_android.apk");
//start 一些非必要的设置
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setVisibleInDownloadsUi(true);
request.setTitle("");
//end 一些非必要的设置
mDownloadManager.enqueue(request);
}
ダウンロード プロセス中、メッセージ通知バーで進行状況を確認します。ここで、APK バージョンを更新できます。クリックしてプログラムをインストールしますが、ダウンロード後にインストール ページに直接ジャンプし、下に進みます。
4. ダウンロードが完了したら、インストールページに移動します
ブロードキャストを定義する必要があります
/**
* Created by Forrest.
* User: Administrator
* Date: 2020/12/28
* Description:
*/
public class DownLoadCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())){
long id=intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID,-1);
Toast.makeText(context, "下载任务已经完成!", Toast.LENGTH_SHORT).show();
DownloadManager.Query query=new DownloadManager.Query();
DownloadManager dm= (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
query.setFilterById(id);
Cursor c=dm.query(query);
if (c!=null){
try {
if (c.moveToFirst()){
String filename=c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
int status=c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
if (status==DownloadManager.STATUS_SUCCESSFUL){
Uri uri=Uri.fromFile(new File(filename));
if (uri!=null){
Intent intent1=new Intent(Intent.ACTION_VIEW);
intent1.setDataAndType(uri,"application/vnd.android.package-archive");
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent1);
}
}
}
}catch (Exception e){
e.printStackTrace();
return;
}finally {
c.close();
}
}
}
}
}
次にマニフェストファイルに登録します
<application
android:name="com.dhy.health.app.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
//......
<receiver android:name="com.dhy.health.utils.DownLoadCompleteReceiver">
<intent-filter>
<action android:name="android.intent.action.DOWNLOAD_COMPLETE"/>
</intent-filter>
</receiver>
//......
</application>
ダウンロードが完了すると、自動的にインストール ページに移動します。[インストール] をクリックするだけです。インストールが成功したら、[完了] または [開く] を選択します。どちらをクリックしても、ダウンロードしたインストールを削除するかどうかを尋ねられます。パッケージを削除すれば問題ありません。メモリ容量を消費しません。
以下に完全なコードを貼り付けてください
import androidx.appcompat.app.AppCompatActivity;
import android.app.AlertDialog;
import android.app.DownloadManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import com.dhy.health.svndemo.R;
public class Main10Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main10);
if (Integer.parseInt(getAppVersionCode(this))>1){
ShowDialog();
}
}
/**
* 获取系统版本号
* */
public String getAppVersionCode(Context context) {
int versioncode = 0;
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
// versionName = pi.versionName;
versioncode = pi.versionCode;
} catch (Exception e) {
Log.e("VersionInfo", "Exception", e);
}
return versioncode + "";
}
/**
* 获取系统版本名称
* */
public String getAppVersionName(Context context) {
String versionName=null;
try {
PackageManager pm = context.getPackageManager();
PackageInfo pi = pm.getPackageInfo(context.getPackageName(), 0);
versionName = pi.versionName;
} catch (Exception e) {
Log.e("VersionInfo", "Exception", e);
}
return versionName;
}
/**
* 弹框询问是否更新版本
* */
private void ShowDialog(){
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("有新版本");
builder.setMessage("更新内容");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
getAPK();
}
}); builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.show();
}
/**
* 下载apk
* */
public void getAPK(){
DownloadManager mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
String apkUrl = "https://qd.myapp.com/myapp/qqteam/AndroidQQ/mobileqq_android.apk";
Uri resource = Uri.parse(apkUrl);
DownloadManager.Request request=new DownloadManager.Request(resource);
//下载的本地路径,表示设置下载地址为SD卡的Download文件夹,文件名为mobileqq_android.apk。
request.setDestinationInExternalPublicDir("Download", "mobileqq_android.apk");
//start 一些非必要的设置
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setVisibleInDownloadsUi(true);
request.setTitle("");
//end 一些非必要的设置
mDownloadManager.enqueue(request);
}
}