我自己试的可以。中心思想就是打开软件的时候,创建一个指定文件,然后这个文件里只有一个数字来表示需不需要拉起。
一个service:
public class RunService extends Service {
Timer timer;
private int countdown = 10;
public static final String path = Environment.getExternalStorageDirectory() + "/seestech/cfg.json";
public RunService() {
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
init();
}
private void init() {
setTimer();
}
private void setTimer() {
if (timer != null) {
timer.cancel();
}
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
countdown--;
if (countdown == 0) {
if (getNum() == 1){
timer.cancel();
killAppProcess();
}else {
handler.sendEmptyMessage(3000);
countdown = 10;
}
}
}
}, 0, 1000);
}
private int getNum(){
int num = 0;
String data = FileUtils.readFileToString(new File(path));
if (!TextUtils.isEmpty(data)) {
try {
JSONObject object = new JSONObject(data);
num = object.getInt("num");
} catch (JSONException e) {
e.printStackTrace();
LogHandler.writeFile("RunService_getNum","失败+异常:" + e.getMessage());
}
}
Log.e("RunService_getNum()","读取num:" + num);
LogHandler.writeFile("RunService_getNum()","读取num:" + num);
return num;
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 3000) {
// 判断是否在前台,如果不在的话会重启
resumeApp();
}
}
};
private void resumeApp() {
boolean isRun = isAppOnForeground();
if (!isRun) {
JumpHelper.enterNewActivityByService(getBaseContext(), WelcomeActivity.class);
}
Log.e("RunService","应用是否在前台:" + isRun);
LogHandler.writeFile("RunService","应用是否在前台:" + isRun);
}
//在进程中去寻找当前APP的信息,判断是否在前台运行
public boolean isAppOnForeground() {
ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(
Context.ACTIVITY_SERVICE);
String packageName = getApplicationContext().getPackageName();
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null)
return false;
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(packageName)
&& appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
return true;
}
}
return false;
}
public void killAppProcess()
{
//注意:不能先杀掉主进程,否则逻辑代码无法继续执行,需先杀掉相关进程最后杀掉主进程
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> mList = mActivityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo runningAppProcessInfo : mList)
{
if (runningAppProcessInfo.pid != android.os.Process.myPid())
{
android.os.Process.killProcess(runningAppProcessInfo.pid);
}
}
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
}
主要就是用他来检测的,开启服务之后,每10秒检测一次,若本应用不在台前,且指定文件读取出来为0,则软件为意外死亡,需要拉起,若为1,则为指定退出,不需要拉起来。
注意要在AndroidManifest中注册此service。
需要在开启服务之前,先创建文件并写入数据。:
FileUtils.modifyFile(pathPull,port0,false);
/**
* 修改文件内容(覆盖或者添加)
*
* @param path 文件地址
* @param content 覆盖内容
* @param append 指定了写入的方式,是覆盖写还是追加写(true=追加)(false=覆盖)
*/
public static void modifyFile(String path, String content, boolean append) {
try {
FileWriter fileWriter = new FileWriter(path, append);
BufferedWriter writer = new BufferedWriter(fileWriter);
writer.append(content);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
用Intent来开启服务。
private Intent intentRunSys;
intentRunSys = new Intent(this,RunService.class);
startService(intentRunSys);
我是在主Activity的onCreate方法里写的。
在想要退出时,写一个:
FileUtils.modifyFile(pathPull,port1,false);
那么当应用不在前台时,读取到的就会是1,那么就不会拉起程序了。