程序在运行过程中,可能会由于某种原因而被干掉或者自己崩溃掉,为了增加可靠性,一般的做法就是在系统启动之后,自动起一个看门狗程序,来时刻看守应用程序。
由于本人对android也不是很精通 所以想到了以下办法,直接上代码
import android.app.ActivityManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
String m_sMonitorAppName = "app"; //要监测的App的包名
//这里我起了一个线程
/*********************************************************************/
class MyThread implements Runnable {
public void run(){
while(true){
ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningTasks = manager.getRunningAppProcesses();
// 获得当前最顶端的任务栈,即前台任务栈
ActivityManager.RunningAppProcessInfo runningTaskInfo = runningTasks.get(0);
String packageName = runningTaskInfo.processName.toString();
if(!packageName.equals(m_sMonitorAppName)){
PackageManager packageManager = getPackageManager();
PackageInfo packageInfo = null;
//在这里,该App虽然没在前台运行,也有可能在后台运行(未被结束),
//为了更合理,应该先结束掉,但是注释的方法总是崩溃..........
//android.os.Process.killProcess(runningTaskInfo.pid); //结束进程
try {
packageInfo = getPackageManager().getPackageInfo(packageName, 0);
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
if(packageInfo != null){
Intent intent = packageManager.getLaunchIntentForPackage(m_sMonitorAppName);
startActivity(intent);//启动App
}
}
try {
Thread.sleep(3000); //延时3s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/*********************************************************************/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/*
TimerTask task= new TimerTask() {
@Override
public void run() {
}
};
new Timer().schedule(task,2000,3000);
起初,没想用线程,想用一个定时器来看守,怎想,一直崩溃
*/
MyThread startThread = new MyThread();
new Thread(startThread ).start(); //启动线程
}
}
// fest.xml文件加权限 <uses-permission android:name="android.permission.GET_TASKS"/>
上面的方法 经过初步测试 可以达到预期的作用
但是有没有漏洞还不知道 望各位指正