Android 定制设备崩溃后app自动打开自身(应用保活功能,保持应用一直处于存活状态)

前几天,公司让我做一个功能,说是看门狗功能,我一脸懵了,因为,我才疏学浅,不知道啥意思,经过进一步了解吧,意思就是,应用在崩溃之后,能让应用在一定时间内自己启动自己本身的一个功能,当然,看了一下,还是有很多种做法的,我不一定有别人写的好,但是,我觉得,自己写出来也是一种成就,然后,我就自己稍微琢磨了下,原理呢,就是,开启服务,让服务循环检测自身应用是否存活着,如果存活就不做操作,如果不存活就开启应用,就是这么理解的,话不多说了,我就直接上代码吧 ,有问题的话,我就把代码也上传上去,有需要下载就是了

1、首先,我们创建一个服务,我给起了一个通俗易懂的名字KeepLiveService,字面就能理解,可以吧 然后呢,在里面进行判断应用存活状态,等等之类的,直接看代码吧,我也不多说了 ,

package com.example.demo.service;import android.app.ActivityManager;
import android.app.Notification;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;import androidx.annotation.Nullable;import java.util.List;
import java.util.Timer;
import java.util.TimerTask;public class KeepLiveService extends Service {private TimerTask task;private Timer timer;private Intent sevice;@Overridepublic void onCreate() {super.onCreate();if (task != null) {task.cancel();task = null;}task = createVideoSchedulerTimer();if (timer != null) {timer.cancel();timer = null;}timer = new Timer();long delay = 15000;long intevalPeriod = 15 * 1000;timer.schedule(task, delay, intevalPeriod);}@Overridepublic int onStartCommand(@Nullable Intent intent, int flags, int startId) {if (intent == null) {startServices();}Notification notification = new Notification(R.mipmap.ic_launcher, "前台服务!应用包活!", System.currentTimeMillis());//设置通知默认效果notification.flags = Notification.FLAG_SHOW_LIGHTS;startForeground(1, notification);return Service.START_STICKY;}private void startServices() {stopSelf();if (sevice == null)sevice = new Intent(this, KeepLiveService.class);startService(sevice);}private TimerTask createVideoSchedulerTimer() {TimerTask timerTask = new TimerTask() {@Overridepublic void run() {//判断程序是否在运行boolean isRunning = isServiceStarted(getApplicationContext(), "com.example.pisplayer001");//没有运行就开启他if (!isRunning) {Log.e("MyTestService", "程序未开启============");
//下面getLaunchIntentforPackage()里面的参数是你程序的报名,也就是,build.gradle里面的applicationId,所以,这里你要记得更改一下 Intent intent = getPackageManager().getLaunchIntentForPackage("com.example.pisplayer001");startActivity(intent);}
//                else {
//                    Log.e("MyTestService", "========程序已经运行了==========");
//                }}};return timerTask;}/*** 检测一个android程序是否在运行** @param context* @param PackageName* @return*/public static boolean isServiceStarted(Context context, String PackageName) {boolean isStarted = false;ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List list = am.getRunningTasks(100);for (ActivityManager.RunningTaskInfo info : list) {if (info.topActivity.getPackageName().equals(PackageName) && info.baseActivity.getPackageName().equals(PackageName)) {isStarted = true;break;}}return isStarted;}@Overridepublic void onLowMemory() {startServices();super.onLowMemory();}@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onDestroy() {if (task != null) {task.cancel();task = null;}if (timer != null) {timer.cancel();timer = null;}super.onDestroy();}
}

 

2、在AndroidManifest.xml的Application标签下,注册服务

  

3、就是启动服务啦 ,在你需要开启服务的地方,也就是,程序主入口那里,进行开启,这样保证程序启动就开启服务,也就能一直检测这程序是否开启了 ,这里,有个地方说明一下,就是,程序自检的时候,我在里面备注了,要将自己的applicationId写上,上面是我自己的包名,你不更改是不能用的,所以要注意一下

    Intent seviceIntent = new Intent(this, KeepLiveService.class);startService(seviceIntent );

3、其次呢,其次呢,额,其次,其实就完成了,没了,就这些了 ,当你应用崩溃后,经过一定时间就能重启应用了,当然,你不能在你程序不稳定的情况下添加这个,在你测试结束后,如果没有出现问题,就添加上这个,如果出现突然的bug,应用不至于被杀死的状态,这样,不会造成不必要的麻烦了,应用的自启动时间,也就是,检测崩溃的时间,你可以设定,在程序里面,参数咋onCreat里面的  delay还有intevalPeriod,这两个参数,意思是delay是程序开启多长时间后,启动这个服务,intevalPeriod这个参数是,程序崩溃后,多长时间再进行自检,如果检测到程序崩溃了,就立即启动程序,下面是我上传的一个demo资源,不明白的话,就看一下吧,很简单 的

 

资源链接,点我,点我,有用的话给个赞,鼓励下我,谢谢

 

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部