diff --git a/app/build.gradle b/app/build.gradle
index 4980645..3cb11e5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,5 +1,13 @@
apply plugin: 'com.android.application'
+def appName() {
+ return "应用市场"
+}
+
+def releaseTime() {
+ return new Date().format("yyyyMMddHHmmss", TimeZone.getDefault())
+}
+
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
@@ -11,10 +19,67 @@ android {
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
+ lintOptions {
+ checkReleaseBuilds false
+ }
+ //签名
+ signingConfigs {
+ debug {
+ storeFile file("src/keys/SchoolEbaiFeng.jks")
+ storePassword "123456"
+ keyAlias "key0"
+ keyPassword "123456"
+ v2SigningEnabled false
+ }
+ release {// 签名文件
+ storeFile file("src/keys/SchoolEbaiFeng.jks")
+ storePassword "123456"
+ keyAlias "key0"
+ keyPassword "123456"
+ v2SigningEnabled false
+ }
+ }
+
buildTypes {
- release {
+ debug {
+ // 显示Log
+ buildConfigField "boolean", "LOG_DEBUG", "true"
+ versionNameSuffix "-debug"
minifyEnabled false
- proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ //Zipalign优化
+ zipAlignEnabled true
+ signingConfig signingConfigs.debug
+ applicationVariants.all { variant ->
+ variant.outputs.each { output ->
+ if (outputFile != null) {
+ def fileName = "${appName()}-V${defaultConfig.versionName}-${releaseTime()}.apk"
+ output.outputFileName = fileName
+ }
+ }
+ }
+ }
+ release {
+ // 不显示Log
+ buildConfigField "boolean", "LOG_DEBUG", "false"
+ //混淆
+ minifyEnabled false
+ //Zipalign优化
+ zipAlignEnabled true
+ //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ //签名
+ signingConfig signingConfigs.release
+// 将release版本的包名重命名,加上版本及日期
+ applicationVariants.all { variant ->
+ variant.outputs.each { output ->
+ def outputFile = ""
+ if (outputFile != null) {
+ def fileName = "${appName()}-${defaultConfig.versionCode}-V${defaultConfig.versionName}-${releaseTime()}.apk"
+ output.outputFileName = new File(outputFile, fileName)
+
+ }
+ }
+ }
}
}
}
@@ -37,9 +102,9 @@ dependencies {
implementation 'com.arialyy.aria:core:3.7.7'
annotationProcessor 'com.arialyy.aria:compiler:3.7.7'
//OKGO
- implementation 'com.lzy.net:okgo:3.0.4'
- implementation 'com.lzy.net:okrx:1.0.2'
- implementation 'com.lzy.net:okserver:2.0.5'
+ implementation 'com.lzy.net:okgo:2.1.4'
+ implementation 'com.lzy.net:okrx:0.1.2'
+ implementation 'com.lzy.net:okserver:1.1.3'
implementation 'com.alibaba:fastjson:1.2.21'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 588adaa..3394e38 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -6,11 +6,12 @@
+
post(Url.GET_ALL_APPINFO).execute(new StringCallback() {
- @Override
- public void onSuccess(Response response) {
- try {
- JSONObject body = JSON.parseObject(response.body());
-// Log.e("onSuccess", body.toString());
- int code = body.getInteger("code");
- String msg = body.getString("msg");
- String data = body.getString("data");
- List applist = JSON.parseArray(data, AppInfo.class);
- if (code == 200) {
- Message message = new Message();
- message.what = 0;
- message.obj = applist;
- handler.sendMessage(message);
- } else {
- ToastUtil.show(msg);
- }
- } catch (Exception e) {
- Log.e("Exception", e.getMessage());
- }
- }
-
- @Override
- public void onError(Response response) {
- super.onError(response);
- Log.e("Exception", response.getException().toString());
-
- }
- });
+ synchronized private void initAPPData(final Handler handler) {
+ OKGOPost.getAllAppInfo(handler);
mRefreshLayout.finishRefresh();
}
diff --git a/app/src/main/java/com/appstore/uiui/network/OKGOPost.java b/app/src/main/java/com/appstore/uiui/network/OKGOPost.java
new file mode 100644
index 0000000..39fe6fb
--- /dev/null
+++ b/app/src/main/java/com/appstore/uiui/network/OKGOPost.java
@@ -0,0 +1,59 @@
+package com.appstore.uiui.network;
+
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.appstore.uiui.bean.AppInfo;
+import com.appstore.uiui.network.URLs.Url;
+import com.appstore.uiui.utils.LogUtils;
+import com.appstore.uiui.utils.ToastUtil;
+import com.lzy.okgo.OkGo;
+import com.lzy.okgo.callback.StringCallback;
+import com.lzy.okgo.model.Response;
+
+
+import java.util.List;
+
+import okhttp3.Call;
+
+
+public class OKGOPost {
+ synchronized public static void getAllAppInfo(final Handler handler) {
+ OkGo.post(Url.GET_ALL_APPINFO).execute(new StringCallback() {
+ @Override
+ public void onSuccess(String s, Call call, okhttp3.Response response) {
+ try {
+ JSONObject body = JSON.parseObject(s);
+// Log.e("onSuccess", body.toString());
+ int code = body.getInteger("code");
+ String msg = body.getString("msg");
+ String data = body.getString("data");
+ List applist = JSON.parseArray(data, AppInfo.class);
+ if (code == 200) {
+ Message message = new Message();
+ message.what = 0;
+ message.obj = applist;
+ handler.sendMessage(message);
+ } else {
+ ToastUtil.show(msg);
+ }
+ } catch (Exception e) {
+ Log.e("Exception", e.getMessage());
+ ToastUtil.show("服务器错误,请稍后重试");
+
+ }
+ }
+
+ @Override
+ public void onError(Call call, okhttp3.Response response, Exception e) {
+ super.onError(call, response, e);
+ LogUtils.e("Exception", e.getMessage());
+ ToastUtil.show("网络连接失败,检查网络连接");
+ }
+ });
+
+ }
+}
diff --git a/app/src/main/java/com/appstore/uiui/service/GuardService.java b/app/src/main/java/com/appstore/uiui/service/GuardService.java
new file mode 100644
index 0000000..05ffffb
--- /dev/null
+++ b/app/src/main/java/com/appstore/uiui/service/GuardService.java
@@ -0,0 +1,99 @@
+package com.appstore.uiui.service;
+
+/**
+ * 作者 mjsheng
+ * 日期 2019/4/1 10:58
+ * 邮箱 501802639@qq.com
+ * 来自:
+ */
+
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+import com.appstore.uiui.utils.ApkUtils;
+import com.appstore.uiui.utils.ServiceAliveUtils;
+import com.arialyy.annotations.Download;
+import com.arialyy.aria.core.Aria;
+import com.arialyy.aria.core.task.DownloadTask;
+import com.blankj.utilcode.util.LogUtils;
+import com.blankj.utilcode.util.ToastUtils;
+
+
+/**
+ * 守护进程 双进程通讯
+ *
+ * @author LiGuangMin
+ * @time Created by 2018/8/17 11:27
+ */
+public class GuardService extends Service {
+ private final static String TAG = GuardService.class.getSimpleName();
+ private ServiceConnection mServiceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
+ LogUtils.e(TAG, "GuardService:建立链接");
+ boolean isServiceRunning = ServiceAliveUtils.isServiceAlice();
+ if (!isServiceRunning) {
+ Intent i = new Intent(GuardService.this, MyDownloadService.class);
+ startService(i);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName componentName) {
+ // 断开链接
+ startService(new Intent(GuardService.this, StepService.class));
+ // 重新绑定
+ bindService(new Intent(GuardService.this, StepService.class), mServiceConnection, Context.BIND_IMPORTANT);
+ }
+ };
+
+ @Nullable
+ @Override
+ public IBinder onBind(Intent intent) {
+// return new KeepAliveConnection.Stub() {};
+ return null;
+
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+
+
+ Aria.init(this);
+ Aria.get(this).getDownloadConfig().setMaxTaskNum(1);
+
+
+ Aria.download(this).register();
+
+
+ // startForeground(1, new Notification());
+ // 绑定建立链接
+ bindService(new Intent(this, StepService.class), mServiceConnection, Context.BIND_IMPORTANT);
+ return START_STICKY;
+ }
+
+ //在这里处理任务执行中的状态,如进度进度条的刷新
+ @Download.onTaskRunning
+ protected void running(DownloadTask task) {
+ Log.e("mjsheng", "我在下载=--------------::" + task.getState() + "-------" + task.getPercent() + "-------" + task.getExtendField());
+ ToastUtils.showShort("我在下载=--------------::" + task.getExtendField() + "-------" + task.getPercent());
+ }
+
+ @Download.onTaskComplete
+ void taskComplete(DownloadTask task) {
+ //在这里处理任务完成的状态
+ String downloadPath = task.getFilePath();
+ String packageName = task.getExtendField();
+ Log.e("mjsheng", "downloadPath::" + downloadPath);
+ Log.e("mjsheng", "extendField::" + packageName);
+ ApkUtils.installApkInSilence(downloadPath, packageName);
+ }
+}
+
diff --git a/app/src/main/java/com/appstore/uiui/service/MyDownloadService.java b/app/src/main/java/com/appstore/uiui/service/MyDownloadService.java
new file mode 100644
index 0000000..abb5f73
--- /dev/null
+++ b/app/src/main/java/com/appstore/uiui/service/MyDownloadService.java
@@ -0,0 +1,347 @@
+
+package com.appstore.uiui.service;
+
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.os.IBinder;
+import android.provider.Settings;
+import android.util.Log;
+
+import androidx.annotation.Nullable;
+
+import com.appstore.uiui.MyApplication;
+import com.appstore.uiui.bean.AppDateInfo;
+import com.appstore.uiui.bean.AppDownloadInfo;
+import com.appstore.uiui.utils.ApkUtils;
+import com.appstore.uiui.utils.SaveListUtils;
+import com.appstore.uiui.utils.StorageUtils;
+import com.appstore.uiui.utils.Utils;
+import com.lzy.okgo.OkGo;
+import com.lzy.okgo.request.GetRequest;
+import com.lzy.okserver.download.DownloadInfo;
+import com.lzy.okserver.download.DownloadManager;
+import com.lzy.okserver.download.DownloadService;
+import com.lzy.okserver.listener.DownloadListener;
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+// 下载管理服务
+public class MyDownloadService extends Service {
+
+ private DownloadReceiver downloadReceiver;
+ private DownloadManager downloadManager;
+ public List allTask;
+ private List downloadURL; // 当前下载的任务
+ private static final String ACTION_START = "START";
+ private static final String ACTION_STOP = "STOP";
+
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+ flags = START_STICKY;
+ return super.onStartCommand(intent, flags, startId);
+ }
+
+ @Override
+ public void onCreate() {
+
+ super.onCreate();
+ downloadManager = DownloadService.getDownloadManager();
+ downloadManager.getThreadPool().setCorePoolSize(1);
+ allTask = downloadManager.getAllTask();
+ for (DownloadInfo downloadInfo : allTask) {
+ DownloadListener downloadListener = new MyDownloadListener();
+ downloadListener.setUserTag(downloadInfo.getUrl());
+ downloadInfo.setListener(downloadListener);
+ }
+ downloadReceiver = new DownloadReceiver();
+ downloadURL = new ArrayList<>();
+ /* 注册广播 */
+ IntentFilter mScreenOnFilter = new IntentFilter();
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_STARTALL_ACTION);
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_DELETE_UPDATE_ACTION);
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_START_ACTION);
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_STOP_ACTION);
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_INITIALIZE_ACTION);
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_DELETE_URL_ACTION);
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_DELETE_PACKAGENAME_ACTION);
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_DELETEALL_ACTION);
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_ALLTASK_ACTION);
+ mScreenOnFilter.addAction(Utils.DOWNLOAD_PACKAGENAME_ACTION);
+ MyDownloadService.this.registerReceiver(downloadReceiver, mScreenOnFilter);
+
+ startService(new Intent(this, StepService.class));
+ startService(new Intent(this, GuardService.class));
+ }
+
+ @Override
+ public void onStart(Intent intent, int startId) {
+ super.onStart(intent, startId);
+ }
+
+ @Override
+ public void onDestroy() {
+ super.onDestroy();
+ if (downloadManager != null) {
+ downloadManager.stopAllTask();
+ }
+ if (allTask != null) {
+ allTask.clear();
+ allTask = null;
+ }
+ downloadURL.clear();
+ MyDownloadService.this.unregisterReceiver(downloadReceiver);
+ Intent sevice = new Intent(this, DownloadService.class);
+ this.startService(sevice);
+ }
+
+ @Nullable
+ @Override
+ public IBinder onBind(Intent intent) {
+ return null;
+ }
+
+ private class MyDownloadListener extends DownloadListener {
+
+ @Override
+ public void onProgress(DownloadInfo downloadInfo) {
+ Log.e("mjsheng", "onProgress::::::::" + downloadInfo.getProgress());
+ sendDownloadState(downloadInfo);
+ }
+
+ @Override
+ public void onFinish(DownloadInfo downloadInfo) {
+ sendDownloadState(downloadInfo);
+ AppDateInfo info = (AppDateInfo) downloadInfo.getData();
+ if (info.getApp_baoming().equals(Utils.YOUNGSYSTEM_APP_TONGBU) || info.getApp_baoming().equals(MyApplication.getAppContext().getPackageName())) {
+// ApkUtils.install(MyApplication.getAppContext(), new File(downloadInfo.getTargetPath()));
+ ApkUtils.installApkInSilence(downloadInfo.getTargetPath(), info.getApp_baoming());
+ }
+ if (downloadURL.contains(downloadInfo.getUrl())) {
+// ApkUtils.install(MyApplication.getAppContext(), new File(downloadInfo.getTargetPath()));
+ ApkUtils.installApkInSilence(downloadInfo.getTargetPath(), info.getApp_baoming());
+ downloadURL.remove(downloadInfo.getUrl());
+ }
+ }
+
+ @Override
+ public void onError(DownloadInfo downloadInfo, String errorMsg, Exception e) {
+ sendDownloadState(downloadInfo);
+ }
+ }
+
+ private void sendDownloadState(DownloadInfo downloadInfo) {
+ if (downloadInfo == null) return;
+ AppDownloadInfo info = new AppDownloadInfo();
+ info.setFileName(downloadInfo.getFileName());
+ info.setProgress(downloadInfo.getProgress());
+ info.setTargetPath(downloadInfo.getTargetPath());
+ info.setUrl(downloadInfo.getUrl());
+ info.setState(downloadInfo.getState());
+ info.setDownloadLength(downloadInfo.getDownloadLength());
+ info.setTotalLength(downloadInfo.getTotalLength());
+ AppDateInfo dateInfo = (AppDateInfo) downloadInfo.getData();
+ info.setPackageName(dateInfo.getApp_baoming());
+ info.setVersion(dateInfo.getApp_banben());
+ info.setData(dateInfo);
+ Intent intent = new Intent();
+ intent.setAction(Utils.DOWNLOAD_SERVICE_ACTION);
+ intent.putExtra("DownloadInfo", info);
+ sendBroadcast(intent);
+ }
+
+ /**
+ * 是否存在该包名的下载任务
+ */
+ public DownloadInfo getPackageName(String packagename) {
+ if (packagename != null) {
+ for (DownloadInfo downloadInfo : allTask) {
+ AppDateInfo info = (AppDateInfo) downloadInfo.getData();
+ if (info.getApp_baoming() != null) {
+ if (info.getApp_baoming().equals(packagename)) {
+ return downloadInfo;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
+
+ public class DownloadReceiver extends BroadcastReceiver {
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (Utils.DOWNLOAD_STARTALL_ACTION.equals(intent.getAction())) {
+ downloadManager.startAllTask();
+ } else if (Utils.DOWNLOAD_DELETE_URL_ACTION.equals(intent.getAction())) {
+ // 删除标识 下载地址
+ String URL = intent.getStringExtra("URL");
+ DownloadInfo downloadInfo = downloadManager.getDownloadInfo(URL);
+ if (downloadInfo != null && StorageUtils.isFileIsExists(downloadInfo.getTargetPath())) {
+ downloadInfo.setState(10);
+ sendDownloadState(downloadInfo);
+ downloadManager.removeTask(downloadInfo.getUrl(), true);
+ }
+ } else if (Utils.DOWNLOAD_START_ACTION.equals(intent.getAction())) {
+ // 下载
+ String URL = intent.getStringExtra("URL");
+ AppDateInfo appDateInfo = (AppDateInfo) intent.getSerializableExtra("AppDateInfo");
+ if (appDateInfo != null) {
+ GetRequest request = OkGo.get(URL);
+ MyDownloadListener listener = new MyDownloadListener();
+ listener.setUserTag(URL);
+ if (URL != null) {
+ if (downloadManager.getDownloadInfo(URL) == null) {
+ if (!StorageUtils.isFileIsExists("/Android/data/" + context.getPackageName() + "/files/Download")) {
+ StorageUtils.getFileRoot(context);
+ }
+ downloadManager.addTask(URL, appDateInfo, request, listener);
+ SaveListUtils.addDownLoadList(appDateInfo.getApp_baoming());
+ DownloadInfo downloadInfo = downloadManager.getDownloadInfo(URL);
+ AppDownloadInfo info = new AppDownloadInfo();
+ info.setFileName(downloadInfo.getFileName());
+ info.setProgress(downloadInfo.getProgress());
+ info.setTargetPath(downloadInfo.getTargetPath());
+ info.setUrl(downloadInfo.getUrl());
+ info.setState(downloadInfo.getState());
+ info.setDownloadLength(downloadInfo.getDownloadLength());
+ info.setTotalLength(downloadInfo.getTotalLength());
+ AppDateInfo dateInfo = (AppDateInfo) downloadInfo.getData();
+ info.setPackageName(dateInfo.getApp_baoming());
+ String s = Settings.System.getString(getContentResolver(), "qch_app_forbid");
+ Settings.System.putString(getContentResolver(), "qch_app_forbid", s + "," + dateInfo.getApp_baoming());
+ Log.e("SystemSetting", "qch_app_forbid__________" + Settings.System.getString(getContentResolver(), "qch_app_forbid"));
+
+ //2019.9.26
+ info.setVersion(dateInfo.getApp_banben());
+ info.setData(dateInfo);
+ Intent allIntent = new Intent();
+ allIntent.setAction(Utils.DOWNLOAD_NEWSERVICE_ACTION);
+ allIntent.putExtra("addTask", info);
+ sendBroadcast(allIntent);
+
+ } else {
+ if (!StorageUtils.isFileIsExists(downloadManager.getDownloadInfo(URL).getTargetPath())) {
+ downloadManager.removeTask(URL, true);
+ StorageUtils.getFileRoot(context);
+ }
+ downloadManager.addTask(URL, appDateInfo, request, listener);
+ }
+ if (!downloadURL.contains(URL)) {
+ downloadURL.add(URL);
+ }
+ }
+ } else {
+ if (downloadManager.getDownloadInfo(URL) != null) {
+ downloadManager.restartTask(URL);
+ }
+ }
+ } else if (Utils.DOWNLOAD_INITIALIZE_ACTION.equals(intent.getAction())) {
+ // 初始化item状态
+ String URL = intent.getStringExtra("URL");
+ DownloadInfo downloadInfo = downloadManager.getDownloadInfo(URL);
+ if (downloadInfo != null && StorageUtils.isFileIsExists(downloadInfo.getTargetPath())) {
+ sendDownloadState(downloadInfo);
+ }
+ } else if (Utils.DOWNLOAD_PACKAGENAME_ACTION.equals(intent.getAction())) {
+ // 初始化item状态
+ String packageName = intent.getStringExtra("packageName");
+ DownloadInfo downloadInfo = getPackageName(packageName);
+ if (downloadInfo != null && StorageUtils.isFileIsExists(downloadInfo.getTargetPath())) {
+ sendDownloadState(downloadInfo);
+ }
+ } else if (Utils.DOWNLOAD_STOP_ACTION.equals(intent.getAction())) {
+ // 暂停标识
+ String URL = intent.getStringExtra("URL");
+ downloadManager.pauseTask(URL);
+ DownloadInfo downloadInfo = downloadManager.getDownloadInfo(URL);
+ if (downloadInfo != null && StorageUtils.isFileIsExists(downloadInfo.getTargetPath())) {
+ sendDownloadState(downloadInfo);
+ }
+ } else if (Utils.DOWNLOAD_DELETE_PACKAGENAME_ACTION.equals(intent.getAction())) {
+ // 删除标识 包名
+ String packageName = intent.getStringExtra("packageName");
+ DownloadInfo downloadInfo = getPackageName(packageName);
+ if (downloadInfo != null && StorageUtils.isFileIsExists(downloadInfo.getTargetPath())) {
+ downloadInfo.setState(10);
+ sendDownloadState(downloadInfo);
+ downloadManager.removeTask(downloadInfo.getUrl(), true);
+ }
+ } else if (Utils.DOWNLOAD_DELETE_URL_ACTION.equals(intent.getAction())) {
+ // 删除标识 下载地址
+ String URL = intent.getStringExtra("URL");
+ DownloadInfo downloadInfo = downloadManager.getDownloadInfo(URL);
+ if (downloadInfo != null) {
+ downloadInfo.setState(10);
+ sendDownloadState(downloadInfo);
+ downloadManager.removeTask(downloadInfo.getUrl(), true);
+ }
+ } else if (Utils.DOWNLOAD_DELETE_UPDATE_ACTION.equals(intent.getAction())) {
+ // 删除 应用更新包
+ String packageName = intent.getStringExtra("packageName");
+ DownloadInfo downloadInfo = getPackageName(packageName);
+ if (downloadInfo != null && downloadInfo.getData() != null) {
+ AppDateInfo dateInfo = (AppDateInfo) downloadInfo.getData();
+ PackageManager packageManager = context.getPackageManager();
+ try {
+ PackageInfo packInfo = packageManager.getPackageInfo(context.getPackageName(),
+ 0);
+ String version = packInfo.versionName;
+ String oldVersion = dateInfo.getApp_banben();
+ if (oldVersion == null || oldVersion.equals("")) {
+ downloadManager.removeTask(downloadInfo.getUrl(), true);
+ } else if (Utils.isUpdate(oldVersion, version) == true || oldVersion.equals(version)) {
+ downloadManager.removeTask(downloadInfo.getUrl(), true);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ e.printStackTrace();
+ }
+ if (StorageUtils.isFileIsExists(downloadInfo.getTargetPath())) {
+ downloadInfo.setState(10);
+ sendDownloadState(downloadInfo);
+ downloadManager.removeTask(downloadInfo.getUrl(), true);
+ }
+ }
+ } else if (Utils.DOWNLOAD_ALLTASK_ACTION.equals(intent.getAction())) {
+ downloadManager = DownloadService.getDownloadManager();
+ allTask = downloadManager.getAllTask();
+ List list = new ArrayList<>();
+ for (int i = 0; i < allTask.size(); i++) {
+ DownloadInfo downloadInfo = allTask.get(i);
+ if (downloadInfo != null && StorageUtils.isFileIsExists(downloadInfo.getTargetPath())) {
+ AppDateInfo dateInfo = (AppDateInfo) downloadInfo.getData();
+ if (!dateInfo.getApp_baoming().equals(Utils.YOUNGSYSTEM_APP_TONGBU) && !dateInfo.getApp_baoming().equals(context.getPackageName())) {
+ AppDownloadInfo info = new AppDownloadInfo();
+ info.setFileName(downloadInfo.getFileName());
+ info.setProgress(downloadInfo.getProgress());
+ info.setTargetPath(downloadInfo.getTargetPath());
+ info.setUrl(downloadInfo.getUrl());
+ info.setState(downloadInfo.getState());
+ info.setDownloadLength(downloadInfo.getDownloadLength());
+ info.setTotalLength(downloadInfo.getTotalLength());
+ info.setPackageName(dateInfo.getApp_baoming());
+ info.setVersion(dateInfo.getApp_banben());
+ info.setData(dateInfo);
+ list.add(info);
+ }
+ }
+ }
+ Intent allIntent = new Intent();
+ allIntent.setAction(Utils.DOWNLOAD_ALLSERVICE_ACTION);
+ allIntent.putExtra("allTask", (Serializable) list);
+ sendBroadcast(allIntent);
+ }
+ }
+
+ }
+
+}
diff --git a/app/src/main/java/com/appstore/uiui/service/StepService.java b/app/src/main/java/com/appstore/uiui/service/StepService.java
new file mode 100644
index 0000000..f3cc57a
--- /dev/null
+++ b/app/src/main/java/com/appstore/uiui/service/StepService.java
@@ -0,0 +1,66 @@
+package com.appstore.uiui.service;
+
+/**
+ * 作者 mjsheng
+ * 日期 2019/4/1 10:57
+ * 邮箱 501802639@qq.com
+ * 来自:
+ */
+
+import android.app.Service;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.ServiceConnection;
+import android.os.IBinder;
+
+import androidx.annotation.Nullable;
+
+import com.appstore.uiui.utils.ServiceAliveUtils;
+import com.blankj.utilcode.util.LogUtils;
+
+/**
+ * 主进程 双进程通讯
+ *
+ * @author LiGuangMin
+ * @time Created by 2018/8/17 11:26
+ */
+public class StepService extends Service {
+
+ private final static String TAG = StepService.class.getSimpleName();
+ private ServiceConnection mServiceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
+ LogUtils.e(TAG, "StepService:建立链接");
+ boolean isServiceRunning = ServiceAliveUtils.isServiceAlice();
+ if (!isServiceRunning) {
+ Intent i = new Intent(StepService.this, MyDownloadService.class);
+ startService(i);
+ }
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName componentName) {
+ // 断开链接
+ startService(new Intent(StepService.this, GuardService.class));
+ // 重新绑定
+ bindService(new Intent(StepService.this, GuardService.class), mServiceConnection, Context.BIND_IMPORTANT);
+ }
+ };
+
+ @Nullable
+ @Override
+ public IBinder onBind(Intent intent) {
+// return new KeepAliveConnection.Stub() { };
+ return null;
+ }
+
+ @Override
+ public int onStartCommand(Intent intent, int flags, int startId) {
+// startForeground(1, new Notification());
+ // 绑定建立链接
+ bindService(new Intent(this, GuardService.class), mServiceConnection, Context.BIND_IMPORTANT);
+ return START_STICKY;
+ }
+
+}
diff --git a/app/src/main/java/com/appstore/uiui/utils/LogUtils.java b/app/src/main/java/com/appstore/uiui/utils/LogUtils.java
new file mode 100644
index 0000000..f6700b7
--- /dev/null
+++ b/app/src/main/java/com/appstore/uiui/utils/LogUtils.java
@@ -0,0 +1,37 @@
+package com.appstore.uiui.utils;
+
+import android.util.Log;
+
+import com.appstore.uiui.BuildConfig;
+
+public class LogUtils {
+ public static void v(String tag, String msg) {
+ if (BuildConfig.LOG_DEBUG) {
+ Log.v(tag, msg);
+ }
+ }
+
+ public static void d(String tag, String msg) {
+ if (BuildConfig.LOG_DEBUG) {
+ Log.d(tag, msg);
+ }
+ }
+
+ public static void i(String tag, String msg) {
+ if (BuildConfig.LOG_DEBUG) {
+ Log.i(tag, msg);
+ }
+ }
+
+ public static void w(String tag, String msg) {
+ if (BuildConfig.LOG_DEBUG) {
+ Log.w(tag, msg);
+ }
+ }
+
+ public static void e(String tag, String msg) {
+ if (BuildConfig.LOG_DEBUG) {
+ Log.e(tag, msg);
+ }
+ }
+}
diff --git a/app/src/main/java/com/appstore/uiui/utils/SaveListUtils.java b/app/src/main/java/com/appstore/uiui/utils/SaveListUtils.java
new file mode 100644
index 0000000..599ec91
--- /dev/null
+++ b/app/src/main/java/com/appstore/uiui/utils/SaveListUtils.java
@@ -0,0 +1,66 @@
+package com.appstore.uiui.utils;
+
+import android.util.Log;
+
+import com.appstore.uiui.common.CommonDatas;
+import com.blankj.utilcode.util.SPStaticUtils;
+import com.google.gson.Gson;
+import com.google.gson.reflect.TypeToken;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SaveListUtils {
+ private static List downLoadList = new ArrayList<>();
+
+ public static List getList() {
+ String data = SPStaticUtils.getString(CommonDatas.FORCE_INSTALL);
+ Log.e("mjshenglistdata", data);
+
+ Gson gson = new Gson();
+ Type listType = new TypeToken>() {
+ }.getType();
+ List list = gson.fromJson(data, listType);
+
+// Log.e("mjshenglist1", list.toString());
+ return list;
+ }
+
+ public static void addToList(String data) {
+ List list = getList();
+// Log.e("mjshenglist2", list.toString());
+
+ if (list == null) {
+ list = new ArrayList<>();
+ }
+ if (!list.contains(data)) {
+ list.add(data);
+ Gson gson = new Gson();
+ String gsonData = gson.toJson(list);
+ SPStaticUtils.put(CommonDatas.FORCE_INSTALL, gsonData);
+ }
+ }
+
+ public static List getDownLoadList() {
+
+ return downLoadList;
+ }
+
+ public static void addDownLoadList(String packageName) {
+ if (downLoadList == null) {
+ downLoadList = new ArrayList<>();
+ downLoadList.add(packageName);
+ } else {
+ if (!downLoadList.contains(packageName)) {
+ downLoadList.add(packageName);
+ }
+ }
+ }
+
+ public static boolean isDownLoading(String packageName) {
+ if (downLoadList.contains(packageName)) {
+ return true;
+ } else return false;
+ }
+}
diff --git a/app/src/main/java/com/appstore/uiui/utils/ServiceAliveUtils.java b/app/src/main/java/com/appstore/uiui/utils/ServiceAliveUtils.java
new file mode 100644
index 0000000..2fff427
--- /dev/null
+++ b/app/src/main/java/com/appstore/uiui/utils/ServiceAliveUtils.java
@@ -0,0 +1,24 @@
+package com.appstore.uiui.utils;
+
+import android.app.ActivityManager;
+import android.content.Context;
+
+import com.appstore.uiui.MyApplication;
+
+public class ServiceAliveUtils {
+
+ public static boolean isServiceAlice() {
+ boolean isServiceRunning = false;
+ ActivityManager manager =
+ (ActivityManager) MyApplication.getAppContext().getSystemService(Context.ACTIVITY_SERVICE);
+ if (manager == null) {
+ return true;
+ }
+ for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
+ if ("demo.lgm.com.keepalivedemo.service.DownloadService".equals(service.service.getClassName())) {
+ isServiceRunning = true;
+ }
+ }
+ return isServiceRunning;
+ }
+}
diff --git a/app/src/main/java/com/appstore/uiui/utils/StorageUtils.java b/app/src/main/java/com/appstore/uiui/utils/StorageUtils.java
new file mode 100644
index 0000000..2745a8e
--- /dev/null
+++ b/app/src/main/java/com/appstore/uiui/utils/StorageUtils.java
@@ -0,0 +1,124 @@
+package com.appstore.uiui.utils;
+
+import android.content.Context;
+import android.os.Build;
+import android.os.Environment;
+import android.os.storage.StorageManager;
+
+import java.io.File;
+import java.lang.reflect.Array;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.text.DecimalFormat;
+
+public class StorageUtils {
+
+
+ // 获取存储空间 false 内置sd卡路径,true 外置sd卡路径
+ public static File getStoragePath(Context mContext, boolean isSDcard) {
+ StorageManager mStorageManager = (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE);
+ Class> storageVolumeClazz = null;
+ try {
+ storageVolumeClazz = Class.forName("android.os.storage.StorageVolume");
+ Method getVolumeList = mStorageManager.getClass().getMethod("getVolumeList");
+ Method getPath = storageVolumeClazz.getMethod("getPath");
+ Method isRemovable = storageVolumeClazz.getMethod("isRemovable");
+ Object result = getVolumeList.invoke(mStorageManager);
+ final int length = Array.getLength(result);
+ for (int i = 0; i < length; i++) {
+ Object storageVolumeElement = Array.get(result, i);
+ String path = (String) getPath.invoke(storageVolumeElement);
+ boolean removable = (Boolean) isRemovable.invoke(storageVolumeElement);
+ if (isSDcard == removable) {
+ File file = new File(path);
+ if (file.exists()) {
+ return file;
+ }else {
+ if (!isSDcard) {
+ return Environment.getExternalStorageDirectory();
+ } else {
+ File file1 = new File("root/storage/sdcard1");
+ if (file1.exists()){
+ return file1;
+ }else {
+ File file2 = new File("storage/sdcard1");
+ if (file2.exists()){
+ return file2;
+ }else {
+ File file3 = new File("/storage/emulated/0");
+ if (file3.exists()){
+ return file3;
+ }else {
+ return null;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ } catch (InvocationTargetException e) {
+ e.printStackTrace();
+ } catch (NoSuchMethodException e) {
+ e.printStackTrace();
+ } catch (IllegalAccessException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+
+ public static String getFileCache(Context context, String s) {
+ return getExternalFilesDir(context, s).getAbsolutePath();
+ }
+
+ public static String getFileRoot(Context context) {
+ return getExternalFilesDir(context, "Download").getAbsolutePath();
+ }
+
+ public static File getExternalFilesDir(Context context, String s) {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
+ File path = context.getExternalFilesDir(s);
+ if (path != null) {
+ return path;
+ }
+ }
+ final String cacheDir = "/Android/data/" + context.getPackageName() + "/files/" + s;
+ return new File(Environment.getExternalStorageDirectory().getPath() + cacheDir);
+ }
+
+
+ // 检测文件是否存在
+ public static boolean isFileIsExists(String filePath){
+ try{
+ File f=new File(filePath);
+ if(!f.exists()){
+ return false;
+ }
+ }catch (Exception e) {
+ return false;
+ }
+ return true;
+ }
+
+
+ public static String size(long size) {
+ if (size / (1024 * 1024) > 0) {
+ float tmpSize = (float) (size) / (float) (1024 * 1024 );
+ DecimalFormat df = new DecimalFormat("#.##");
+ return "" + df.format(tmpSize) + "GB";
+ } else if (size / 1024 > 0) {
+ float tmpSize = (float) (size) / (float) 1024 ;
+ DecimalFormat df = new DecimalFormat("#.##");
+ return "" + df.format(tmpSize) + "MB";
+ } else if (size > 0) {
+ return "" + (size ) + "KB";
+ } else {
+ return "" + (size) + "KB";
+ }
+ }
+
+}
diff --git a/app/src/main/res/mipmap-hdpi/ic_app.png b/app/src/main/res/mipmap-hdpi/ic_app.png
new file mode 100644
index 0000000..bde1dfd
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_app.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_app.png b/app/src/main/res/mipmap-mdpi/ic_app.png
new file mode 100644
index 0000000..bde1dfd
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_app.png differ