美文网首页
react-native APP更新(非热更新)

react-native APP更新(非热更新)

作者: Sixology_aff2 | 来源:发表于2018-08-28 14:56 被阅读0次

   当react-native项目中有版本更新需求时,android会用到下载新版本需求,此时,可以通过封装Native Modules 去调用android原生DownloadManager来实现下载,传输下载APK链接地址实现覆盖安装

在android->app->src->main->java->你的包名(com.test.app) 新建3个类

1.DownloadApk.java

package com.test.app;

import android.app.DownloadManager;

import android.app.DownloadManager.Request;

import android.content.Context;

import android.app.Activity;

import android.content.SharedPreferences;

import android.net.Uri;

import android.os.Environment;

import com.facebook.react.bridge.ReactApplicationContext;

import com.facebook.react.bridge.ReactContextBaseJavaModule;

import com.facebook.react.bridge.ReactMethod;

public class DownloadApk extends ReactContextBaseJavaModule{

DownloadManager downManager ;

Activity myActivity;

public DownloadApk(ReactApplicationContext reactContext) {

super(reactContext);

}

@Override

public boolean canOverrideExistingModule() {

return true;

}

@Override

public String getName(){

return "DownloadApk";

}

@ReactMethod

public void downloading(String url,String description){

myActivity =getCurrentActivity();

downManager = (DownloadManager)myActivity.getSystemService(Context.DOWNLOAD_SERVICE);

Uri uri = Uri.parse(url);

DownloadManager.Request request = new Request(uri);

request.setAllowedNetworkTypes(Request.NETWORK_WIFI);

//设置通知栏标题

request.setNotificationVisibility(Request.VISIBILITY_VISIBLE);

request.setMimeType("application/vnd.android.package-archive");

request.setTitle("weiling");

if(description==null||"".equals(description)){

description="目标apk正在下载";

}

request.setDescription(description);

request.setAllowedOverRoaming(false);

//设置文件存放目录

request.setDestinationInExternalFilesDir(myActivity, Environment.DIRECTORY_DOWNLOADS, description);

long downloadid=downManager.enqueue(request);

SharedPreferences sPreferences = myActivity.getSharedPreferences("ggfw_download", 0);

sPreferences.edit().putLong("ggfw_download_apk", downloadid).commit();

}

}

2.DownloadApkPackage.java

package com.test.app;

import com.facebook.react.ReactPackage;

import com.facebook.react.bridge.JavaScriptModule;

import com.facebook.react.bridge.NativeModule;

import com.facebook.react.bridge.ReactApplicationContext;

import com.facebook.react.uimanager.ViewManager;

import java.util.List;

import java.util.Collections;

import java.util.ArrayList;

public class DownloadApkPackage implements ReactPackage {

List<NativeModule> modules=new ArrayList<>();

@Override    

public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {

modules.add(new DownloadApk(reactContext));

return modules;

}

@Override  

public List<Class<? extends JavaScriptModule>> createJSModules() {

return Collections.emptyList();

}

@Override   

public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {

return Collections.emptyList();

}

}

3.DownLoadBroadcastReceiver.java

package com.test.app;

import android.app.DownloadManager;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.content.SharedPreferences;

import android.database.Cursor;

import android.net.Uri;

import android.os.Environment;

import android.util.Log;

import android.widget.Toast;

import java.io.File;

public class DownLoadBroadcastReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

long myDwonloadID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);

SharedPreferences sPreferences = context.getSharedPreferences("ggfw_download", 0);

long refernece = sPreferences.getLong("ggfw_download_apk", 0);

if (refernece == myDwonloadID) {

DownloadManager dManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);

Intent install = new Intent(Intent.ACTION_VIEW);

//            Uri downloadFileUri = dManager.getUriForDownloadedFile(myDwonloadID);

DownloadManager.Query querybyId = new DownloadManager.Query();

querybyId.setFilterById(myDwonloadID);

Cursor myDownload = dManager.query(querybyId);

String dolownname=null;

if(myDownload.moveToFirst()){

int status = myDownload.getInt(myDownload.getColumnIndex(DownloadManager.COLUMN_STATUS));

if (status == DownloadManager.STATUS_SUCCESSFUL) {

// process download

int fileNameIdx = myDownload.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME);

//此处取得的是完整路径+文件名称

dolownname=myDownload.getString(fileNameIdx);

}else{

Toast.makeText(context,"下载失败,删除残留文件",Toast.LENGTH_LONG).show();

dManager.remove(myDwonloadID);

myDownload.close();

return;

}

myDownload.close();

}

if(dolownname==null){

return;

}

File file = new File(dolownname);

install.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");

install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

context.getApplicationContext().startActivity(install);

}}}

记得在AndroidManifest.xml中注册广播监听

记得在MainApplication中增加调用new DownloadApkPackage(),

然后在APP首页进去加载判断是否更新:第一个参数APK下载地址,第二个参数APK下载时候命名

NativeModules.DownloadApk.downloading(this.state.downUrl,"weiling.apk"),

OK就可以看到APK下载成功了,

相关文章

  • react-native APP更新(非热更新)

    当react-native项目中有版本更新需求时,android会用到下载新版本需求,此时,可以通过封装Nati...

  • 轻松配置react native热更新

    react-native项目有个优势就是可以动态更新bundle.js,从而更新App。 框架选择 使用微软出的热...

  • ReactNative App更新下载(Android+iOS)

    APP涉及到版本更新(非热更新),版本检测下载App,Android和iOS实现方式不同 1.Android直接和...

  • CodePush

    热更新 codepush Code Push 热更新使用详细说明和教程 React-Native 使用微软的Cod...

  • React-Native Android集成热更新Code-Pu

    React-Native Android集成热更新Code-Push 更新流程(图片来源:http://www.j...

  • react-native App更新方案

    前言 用react-native(一下简称RN)开发的app的更新方案有很多,其中比较火的是热更新方案,有官方推荐...

  • ionic3 热更新 填坑过程

    最近公司做了手机app需要使用到热更新,先对热更新进行一个简单的介绍吧;` 热更新 热更新是一种app的常用更新方...

  • APP热更新

    用处: 1.在不发新版本或者来不及发新版本的情况下修改BUG。 2.在不发新版本的情况下 实现APP的动态运营,试...

  • App热更新

    开发App,更新迭代是至关重要的,虽说有应用市场来更新,但实际上,在需要紧急发布一个新版本时,应用市场的更新是需要...

  • 热更新

    热更新技术背景 1.热更新定义,APP热更新,就是指软件不通过苹果APP Store的版本更新审核,直接可以自行更...

网友评论

      本文标题:react-native APP更新(非热更新)

      本文链接:https://www.haomeiwen.com/subject/ebwplxtx.html