防止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应用中使用自己事先创建好的 ...
随机推荐
- 关于mysql安装到最后一步老是停留在starting server,显示无响应
从昨天晚上到今天安装MySQL花了好长的时间,一直是在后面starting server 这部就显示无响应,查资料了解到是MySQL有残留,有些注册表文件需要手动清理,下面是具体方法. 1.先用卸载软 ...
- CSS相关
===CSS框架=== https://github.com/lucasgruwez/waffle-grid 一个易于使用的 flexbox 栅格布局系统 ===CSS初始化=== https://g ...
- day06_JDBC学习笔记
============================================================ 一.JDBC概述 为什么要使用JDBC? JDBC:Java DataBase ...
- Node.js NPM 使用介绍
NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器下载并 ...
- Gradle 1.12用户指南翻译——第四十八章. Wrapper 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- strut2接收参数的三种方式
strut2接收参数有三种方式(普通属性\领域对象\模型驱动),分别对三种进行一个总结: 一.普通属性 Jsp代码 <body> <h1>普通属性</h1> < ...
- Bootstrap3 栅格系统-实例:流式布局容器
如何让小屏幕设备上所有列不堆叠在一起,使用针对超小屏幕和中等屏幕设备所定义的类就可以做到,即 .col-xs-* 和 .col-md-*.举例: <!-- Stack the columns o ...
- 微信自定义菜单url默认80端口问题解决
微信自定义菜单url默认80端口的,但是有些服务器上可能配置了多个tomcat.或者是刚好你服务器上80端口被占用了.在这样的情况下,我们可以通过如下方式解决: 首先安装apache,关于apache ...
- UE4实现闪烁效果
官网文档链接:http://docs.unrealengine.com/latest/CHN/Engine/Rendering/Materials/ExpressionReference/Math/i ...
- Java之继承深刻理解
1.关于私有成员变量 无论父类中的成员变量是私有的.共有的.还是其它类型的,子类都会拥有父类中的这些成员变量.但是父类中的私有成员变量,无法在子类中直接访问,必须通过从父类中继承得到的protecte ...