React Native Androidインスタントホットアップデートbundleおよびインクリメンタルアップデートbundle~
本明細書では、ホット・アップデートとホット・アップデートの構想を提供するだけで、具体的な実装コードは、いくつかのコア・コードを提供します.
1.bundleをロード私がbundleをロードする方法はRaactActivityに置くのではなく、ReactApplicationを実現し、mainapplicationに置くと、通常のAndroidコードにもアプリケーションが起動する初期化作業があります.コードは次のとおりです.
デバグならgetJsBundleFile()はローカルディスク上のbundleパッケージを走り、releaseモードでロードされたのはassetsのindexです.android.bundle. 属性isFirstByMainActivityは初めて使用するかどうかを判断し、その後ロードするたびにローカルにダウンロードされたbundleパッケージを2.新しいAppManagerの管理bundleとapkのクラスをbundleと比較し、
updateAppThodsはjsで呼び出されたコードで、jsにはタイマがbundleのバージョンインタフェースをタイミング的に読み取るものがあり、データフォーマットは{bundleVer:"x",bundleUrl:"url",バージョン番号が異なる場合はbundleをダウンロードします.3.bundleのダウンロード
bundleでバージョン番号をローカルに存在します.
4増分更新待ち~~
1.bundleをロード私がbundleをロードする方法はRaactActivityに置くのではなく、ReactApplicationを実現し、mainapplicationに置くと、通常のAndroidコードにもアプリケーションが起動する初期化作業があります.コードは次のとおりです.
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
@Override
protected boolean getUseDeveloperSupport() {
return com.HeMingNetwork.ruyipin.recruiter.BuildConfig.DEBUG;
}
@Override
protected List getPackages() {
return Arrays.asList(
new MainReactPackage(),
);
}
@Nullable
@Override
protected String getJSBundleFile() {
if (BuildConfig.DEBUG) {
return super.getJSBundleFile();
} else {
String path = MainApplication.this.getFilesDir().getAbsolutePath() + "/index.android.bundle";
if (!isFirstByMainActivity) {
return super.getJSBundleFile();
}
if (Utils.isFileExit(path)) {
return MainApplication.this.getFilesDir().getAbsolutePath() + "/index.android.bundle";
} else {
return super.getJSBundleFile();
}
}
}
};
デバグならgetJsBundleFile()はローカルディスク上のbundleパッケージを走り、releaseモードでロードされたのはassetsのindexです.android.bundle. 属性isFirstByMainActivityは初めて使用するかどうかを判断し、その後ロードするたびにローカルにダウンロードされたbundleパッケージを2.新しいAppManagerの管理bundleとapkのクラスをbundleと比較し、
@ReactMethod
public void updateAppThods(ReadableMap readableMap) {
Activity activity = getCurrentActivity();
SharedPreferences sp = activity.getSharedPreferences("latestVersion", 0);
if (Integer.parseInt(sp.getString("bundelVersion", "1")) != Integer.parseInt(readableMap.getString("bundleVer"))) {
NetHelper netHelper = new NetHelper(activity);
netHelper.downJsBundle();
} else {
Log.d("readableArray", " ");
}
}
updateAppThodsはjsで呼び出されたコードで、jsにはタイマがbundleのバージョンインタフェースをタイミング的に読み取るものがあり、データフォーマットは{bundleVer:"x",bundleUrl:"url",バージョン番号が異なる場合はbundleをダウンロードします.3.bundleのダウンロード
public void downJsBundle(String urlStr) {
final String fileName = "index.android.bundle";
final File dir = activity.getFilesDir();
File file = new File(dir, fileName);
Log.d(TAG, file.getAbsolutePath());
if (file.exists()) {
file.delete();
}
OkHttpClient mOkHttpClient = new OkHttpClient();
Request request = new Request.Builder().url(urlStr).build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
// Toast.makeText(activity,"bundle ",Toast.LENGTH_SHORT).show();
Log.e("downJsBundle", "bundle ");
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
new AlertDialog.Builder(activity).setTitle(" ")
.setMessage(" ")
.setPositiveButton(" ", null).show();
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream();
FileOutputStream fileOutputStream = null;
try {
File bundle = new File(dir, fileName);
fileOutputStream = new FileOutputStream(bundle);
byte[] buffer = new byte[2048];
int len = 0;
double fileSize = 0;
while ((len = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
fileSize += len;
}
Log.e("jsbundle", fileSize / 1024 / 1024 + "MB");
fileOutputStream.flush();
Log.e("downJsBundle", "bundle ");
Log.d("downJsBundle", "bundleVersion==" + bundleVersion);
VersionMgr.bundelVersion = bundleVersion;
SharedPreferences sp = activity.getSharedPreferences("latestVersion", 0);
SharedPreferences.Editor edit = sp.edit();
edit.putString("bundelVersion", bundleVersion);
edit.commit();
edit.putString("bundelVersion", VersionMgr.bundelVersion);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
new AlertDialog.Builder(activity).setTitle(" ")
.setMessage(" ?")
.setPositiveButton(" ", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
Intent intent = activity.getBaseContext().getPackageManager().getLaunchIntentForPackage(activity.getBaseContext().getPackageName());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
activity.startActivity(intent);
activity.finish();
}
});
}
})
.setNegativeButton(" ", null)
.show();
}
});
} catch (IOException e) {
Log.e("downJsBundle", "bundle " + e.toString());
e.printStackTrace();
}
// activity.runOnUiThread(new Runnable() {
// @Override
// public void run() {
// activity.startActivity(new Intent(activity, MainActivity.class));
// activity.finish();
// }
// });
}
});
}
bundleでバージョン番号をローカルに存在します.
4増分更新待ち~~