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