防止Android程序被系统kill掉的处理方法
转载请注明出处:http://blog.csdn.net/cuiran/article/details/38851401
目前遇到一个问题程序需要一直运行,并显示在最前端,但是运行一段时间发现会被系统Kill掉,这样程序就退出回到了桌面,不能实现一直运行的效果。为了实现此效果,也想了一些办法。如下:
1、可以将应用改为系统应用——由于程序需要定期更新,如果被放入系统应用,更新会非常麻烦,故没有采用。
2、在软件的onDestroy()方法中,发送重新启动应用的广播——如果程序是直接被kill掉 不会调用onDestroy方法(如果有发现应用被kill掉还会调用此方法,可以留言告知,非常感谢!)
3、新建一个Service,在后台服务定时去检测对应package是否在运行,若没有运行就发送广播告知。
为了实现效果程序同时实现2,3两种方式。
首先新建一个apk将级别改为系统应用,需要添加
android:sharedUserId="android.uid.system"
在此apk中新建一个BroadcastReceiver用于接收重启程序的广播,收到广播会启动所需要运行的apk
然后在新建Service,在Service实现了对所需package是否运行和是否安装的检测,如果没有运行,再检测是否安装,若安装,会发送广播让其启动应用程序
/** * CheckService.java * Copyright(C) 2014 * creator:cuiran 2014-8-26 下午1:20:01 */ package com.xsdl.count.service; import java.util.List; import java.util.Timer; import java.util.TimerTask; import com.xsdl.count.receiver.Constants; import com.xsdl.count.util.LogsUtil; import android.annotation.SuppressLint; import android.app.ActivityManager; import android.app.Service; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.os.Handler; import android.os.IBinder; import android.os.Message; /** * 后台开启服务定时检测 * @author cuiran * @version 1.0.0 */ public class CheckService extends Service { private static final String TAG="CheckService"; private static final String ProcessName = "com.ghyf.mplay"; @Override public IBinder onBind(Intent arg0) { return null; } /* (non-Javadoc) * @see android.app.Service#onCreate() */ @Override public void onCreate() { LogsUtil.i(TAG, "检测服务启动---->>>> "); taskMail = new TimerTask() { @Override public void run() { Message message = new Message(); message.what = 1; handlerMail.sendMessage(message); } }; timerMail.schedule(taskMail, 15000, 5000); super.onCreate(); } private final Timer timerMail = new Timer(); private TimerTask taskMail; @SuppressLint("HandlerLeak") Handler handlerMail = new Handler() { @Override public void handleMessage(Message msg) { // 要做的事情 try { boolean is=isBackgroundRunning(); LogsUtil.i(TAG, "检测播控器 "+ProcessName+" is "+is); if(!is){ /** * 发送广播通知应用启动 */ if(checkPackage()){ Intent myIntent = new Intent(Constants.RESOFTWARE_RECEIVER); myIntent.putExtra("path","test"); myIntent.setAction(Constants.RESOFTWARE_RECEIVER); sendBroadcast(myIntent); } } } catch (Exception e) { e.printStackTrace(); } } }; ActivityManager activityManager=null; PackageManager packageManager=null; PackageInfo pi = null; /** * 检测package是否存在<br> * 2014-8-26 下午3:58:49 * @return * */ public boolean checkPackage() { boolean flag=false; packageManager = getPackageManager(); try { pi = packageManager.getPackageInfo(ProcessName, 0); if(null!=pi){ flag=true; } } catch (NameNotFoundException e) { flag=false; LogsUtil.e(TAG, "出现异常", e); } return flag; } /** * 检测package是否在运行<br> * 2014-8-26 下午3:58:49 * @return * */ private boolean isBackgroundRunning() { activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); if (activityManager == null) return false; // get running tasks processes List<ActivityManager.RunningTaskInfo> processList = activityManager.getRunningTasks(100); for (ActivityManager.RunningTaskInfo info : processList) { if (info.topActivity.getPackageName().startsWith(ProcessName)) { return true; } } return false; } /* (non-Javadoc) * @see android.app.Service#onDestroy() */ @Override public void onDestroy() { try { /** * 释放资源 */ if(taskMail!=null){ taskMail.cancel(); } if(timerMail!=null){ timerMail.cancel(); } } catch (Exception e) { LogsUtil.e(TAG, "出现异常", e); } super.onDestroy(); } }
启动应用程序可以采用如下两种方式:
第一种是直接通过Android的startActivity
public void openCLD(String packageName,Context context) { PackageManager packageManager = context.getPackageManager(); PackageInfo pi = null; try { pi = packageManager.getPackageInfo(packageName, 0); } catch (NameNotFoundException e) { LogsUtil.e("pi", "出现异常", e); } Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null); resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER); resolveIntent.setPackage(pi.packageName); List<ResolveInfo> apps = packageManager.queryIntentActivities(resolveIntent, 0); ResolveInfo ri = apps.iterator().next(); if (ri != null ) { String className = ri.activityInfo.name; Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); ComponentName cn = new ComponentName(packageName, className); intent.setComponent(cn); context.startActivity(intent); } }
第二种是通过执行命令 am start package/package.Activity这种方式启动。
防止Android程序被系统kill掉的处理方法的更多相关文章
- 退出Android程序时清除所有activity的实现方法
思路: 1. 自定义ActivityList管理类,添加删除维护该list; 2.Activity Stack 类似上面: 3.singleTask定义一个Activity为该启动模式,然后当返回时, ...
- Android: HowTo设置app不被系统kill掉
有一种方法可以设置app永远不会被kill,AndroidManifest.xml 中添加: android:persistent="true" 适用于放在/system/app下 ...
- 让Android程序获得系统的权限,实现关机重启,静默安装等功能
引用:http://www.cnblogs.com/welenwho/archive/2012/05/10/2494984.html android想要获得系统权限有几种途径,一种就是你的程序固化的系 ...
- Android app被系统kill的场景
何时发生 当我们的app被切到后台的时候,比如用户按下了home键或者切换到了别的应用,总之是我们的app不再和用户交互了,这个时候对于我们的app来说就是什么事情都可能发生的时候了,因为系统会认为你 ...
- Android项目--浅析系统通讯录中的那些方法
系统通讯录,以前的版本虽然过时了,不过有些东西还是可以用. 1.开启系统联系人添加 /** 添加联系人 */ Intent intent = new Intent(Intent.ACTION_INSE ...
- Android 4.4系统获取root权限的方法
1. 准备工作: 准备一台ubuntu机器,将boot.img复制到该机器上,下载必要的工具sudo apt-get install abootimggit clone https://github. ...
- android 程序防止被360或者系统给kill掉
关于如果和防止android 程序防止被360kill掉之后重启的问题,肯定大家也搜索了好多方法,都不好使,对不对,什么增高权限了,什么进程优先级了,这些东西都不是我们可控的,所以有没有一些非常保险的 ...
- 如何让自己的Android程序永不被系统kill
一般来说,在Android系统中,当某进程较长时间不活动,或系统资源比较紧时,该进程可能被系统kill掉,以此来回收一些资源.Android系统会根据进程的优先级来选择性地杀死一些进程,优先级从高到低 ...
- 在Android程序中使用已有的SQLite数据库
已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的 ...
随机推荐
- 分享一个二维码图片识别控制台程序Demo
怎么用NuGet和配置log4net就不介绍了,直接上代码(QRDecodeDemo.zip). (Visual Studio 2015 下的项目,用的.NET Framework 4.5.2) 吐槽 ...
- python学习之路前端-jQuery
jQuery简介 JQuery是继prototype之后又一个优秀的Javascript库.它是轻量级的js库 ,它兼容CSS3,还兼容各种浏览器(IE 6.0+, FF1.5+, Safa ...
- dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器
# dokcer自动化构建部署java web 基于jenkins+maven+nuxus容器 #环境centos 7.4 docker 18.03.0-ce # nuxus,创建maven本地源(可 ...
- DISC社交风格测试题--老虎 孔雀 考拉 猫头鹰
凭直觉,迅速回答 "我是谁",而不是"我应该是谁,或我想我是谁". 1.关于人生观,我的内心其实是: A 希望能够有尽量多的人生体验,所以会有非常多样化的想法. ...
- 亲密接触Redis-第三天(Redis的Load Balance)
前言 上两天讲述了Redis的基本搭建和基于HA的集群布署方式以及相关的策略和注意点.今天开始讲述Redis的Cluster功能,而这块目前来说网上资料不是太全,就算有1,2篇也只是单讲服务端的搭建也 ...
- 20160220.CCPP体系详解(0030天)
程序片段(01):对称.c 内容概要:对称 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h ...
- Dynamics CRM 导出系统中实体的属性字段到EXCEL
我们在CRM中看元数据信息,可以通过SDK中的metadata browser的解决方案包,但该解决方案包只是在可视化上方便了,但如果我们需要在excel中整理系统的数据字典时这个解决方案包就派不上用 ...
- python获取指定时间差的时间
在分析数据的时间经常需要截取一定范围时间的数据,比如三天之内,两小时前等等时间要求的数据,因此将该部分经常需要用到的功能模块化,方便以后以后用到的时候复用.在此,也分享给大家. <span st ...
- Retrofit2.0+RxJava+Dragger2实现不一样的Android网络架构搭建
Tamic :csdn http://blog.csdn.net/sk719887916 众所周知,手机APP的核心就在于调用后台接口,展示相关信息,方便我们在手机上就能和外界交互.所以APP中网络框 ...
- Python 通过继承实现标准对象的子类
idict是dict的子类,它的键值和属性是同步的,并且有强大的默认值机制. 例如,假设x是idict的一个实例,且x['a']['b']=12,则有x.a.b=12.反之亦然; 假设'c'不在x的键 ...