RyCarPlayer/app/src/main/java/com/zlm/hp/application/HPApplication.java

288 lines
8.1 KiB
Java

package com.zlm.hp.application;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
import androidx.multidex.MultiDexApplication;
import com.dou361.dialogui.DialogUIUtils;
import com.squareup.leakcanary.LeakCanary;
import com.squareup.leakcanary.RefWatcher;
import com.tencent.bugly.crashreport.CrashReport;
import com.zlm.hp.constants.ConfigInfo;
import com.zlm.hp.constants.Constants;
import com.zlm.hp.constants.ResourceConstants;
import com.zlm.hp.db.DBHelper;
import com.zlm.hp.manager.ActivityManager;
import com.zlm.hp.service.FloatService;
import com.zlm.hp.ui.R;
import com.zlm.hp.util.ApkUtil;
import com.zlm.hp.util.CodeLineUtil;
import com.zlm.hp.util.ContextUtil;
import com.zlm.hp.util.ResourceUtil;
import com.zlm.hp.util.ToastUtil;
import com.zlm.hp.util.ZLog;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/**
* Created by zhangliangming on 2018-07-29.
*/
public class HPApplication extends MultiDexApplication {
private Handler mHandler;
/**
* 用来后续监控可能发生泄漏的对象
*/
private static RefWatcher sRefWatcher;
/**
* 用于记录ativity的个数
*/
private int mActivityCounter = 0;
/**
* 全局收集错误信息
*/
private Thread.UncaughtExceptionHandler mErrorHandler = new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread t, Throwable e) {
e.printStackTrace();
//修改保存路径
initLog(ResourceConstants.PATH_CRASH);
//输出配置信息
String codeLineInfo = new CodeLineUtil().getCodeLineInfo();
ZLog.logBuildInfo(getApplicationContext(), codeLineInfo);
ZLog.e(codeLineInfo, "UncaughtException: ", e.getMessage());
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
ToastUtil.showTextToast(getApplicationContext(), getString(R.string.exit_tip));
//关闭app
ActivityManager.getInstance().exit();
}
}, 5000);
}
};
@Override
public void onCreate() {
super.onCreate();
mHandler = new Handler(Looper.getMainLooper());
//全局收集
Thread.setDefaultUncaughtExceptionHandler(mErrorHandler);
//初始化日志
initLog(ResourceConstants.PATH_LOGCAT);
//初始化bugly
initBugly();
//初始化LeakCanary
initLeakCanary();
// 获取当前进程名
String processName = getProcessName(android.os.Process.myPid());
if (getApplicationContext().getPackageName().equals(processName)) {
//主进程
//输出配置信息
ZLog.logBuildInfo(getApplicationContext(), new CodeLineUtil().getCodeLineInfo());
//初始化数据库
initDB();
registerActivityLifecycleCallbacks();
}
//封装全局context
ContextUtil.init(getApplicationContext());
//封装弹出窗口context
DialogUIUtils.init(getApplicationContext());
}
/**
* 注册activity
*/
private void registerActivityLifecycleCallbacks() {
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
mActivityCounter++;
stopFloatService();
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
mActivityCounter--;
startFloatService();
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
});
}
public void startFloatService() {
if (mActivityCounter <= 0) {
ZLog.i(new CodeLineUtil().getCodeLineInfo(), "app background");
if (!isServiceRunning(FloatService.class.getName())) {
ConfigInfo configInfo = ConfigInfo.obtain();
if (configInfo.isShowDesktopLrc()) {
//启动悬浮窗口服务
Intent floatServiceIntent = new Intent(getApplicationContext(), FloatService.class);
startService(floatServiceIntent);
}
}
}
}
public void stopFloatService() {
if (isServiceRunning(FloatService.class.getName())) {
//关闭悬浮窗口服务
Intent floatServiceIntent = new Intent(getApplicationContext(), FloatService.class);
stopService(floatServiceIntent);
}
}
/**
* 判断服务是否正在运行
*
* @param serviceName
* @return
*/
private boolean isServiceRunning(String serviceName) {
android.app.ActivityManager manager = (android.app.ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
for (android.app.ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceName.equals(service.service.getClassName())) {
return true;
}
}
return false;
}
/**
* 初始化数据库
*/
private void initDB() {
DBHelper.getInstance(getApplicationContext());
}
/**
* @throws
* @Description: 初始化LeakCanary
* @param:
* @return:
* @author: zhangliangming
* @date: 2018-08-05 15:24
*/
private void initLeakCanary() {
//初始化LeakCanary
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
sRefWatcher = LeakCanary.install(this);
}
/**
* 用来后续监控可能发生泄漏的对象
*
* @return
*/
public static RefWatcher getRefWatcher() {
return sRefWatcher;
}
/**
* @throws
* @Description: 初始化日志
* @param:
* @return:
* @author: zhangliangming
* @date: 2018-07-29 11:01
*/
private void initLog(String path) {
ZLog.init(getApplicationContext(), ResourceUtil.getFilePath(getApplicationContext(), path), Constants.APPNAME);
}
/**
* @throws
* @Description: 初始化bugly
* @param:
* @return:
* @author: zhangliangming
* @date: 2018-07-29 10:06
*/
private void initBugly() {
CrashReport.initCrashReport(getApplicationContext(), "969a9196a8", false);
CrashReport.putUserData(getApplicationContext(), "DeviceID", ApkUtil.getUniquePsuedoID(getApplicationContext()));
}
/**
* 获取进程号对应的进程名
*
* @param pid 进程号
* @return 进程名
*/
private static String getProcessName(int pid) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader("/proc/" + pid + "/cmdline"));
String processName = reader.readLine();
if (!TextUtils.isEmpty(processName)) {
processName = processName.trim();
}
return processName;
} catch (Throwable throwable) {
throwable.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException exception) {
exception.printStackTrace();
}
}
return null;
}
}