转载请注明出处: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掉的处理方法的更多相关文章

  1. 退出Android程序时清除所有activity的实现方法

    思路: 1. 自定义ActivityList管理类,添加删除维护该list; 2.Activity Stack 类似上面: 3.singleTask定义一个Activity为该启动模式,然后当返回时, ...

  2. Android: HowTo设置app不被系统kill掉

    有一种方法可以设置app永远不会被kill,AndroidManifest.xml 中添加: android:persistent="true" 适用于放在/system/app下 ...

  3. 让Android程序获得系统的权限,实现关机重启,静默安装等功能

    引用:http://www.cnblogs.com/welenwho/archive/2012/05/10/2494984.html android想要获得系统权限有几种途径,一种就是你的程序固化的系 ...

  4. Android app被系统kill的场景

    何时发生 当我们的app被切到后台的时候,比如用户按下了home键或者切换到了别的应用,总之是我们的app不再和用户交互了,这个时候对于我们的app来说就是什么事情都可能发生的时候了,因为系统会认为你 ...

  5. Android项目--浅析系统通讯录中的那些方法

    系统通讯录,以前的版本虽然过时了,不过有些东西还是可以用. 1.开启系统联系人添加 /** 添加联系人 */ Intent intent = new Intent(Intent.ACTION_INSE ...

  6. Android 4.4系统获取root权限的方法

    1. 准备工作: 准备一台ubuntu机器,将boot.img复制到该机器上,下载必要的工具sudo apt-get install abootimggit clone https://github. ...

  7. android 程序防止被360或者系统给kill掉

    关于如果和防止android 程序防止被360kill掉之后重启的问题,肯定大家也搜索了好多方法,都不好使,对不对,什么增高权限了,什么进程优先级了,这些东西都不是我们可控的,所以有没有一些非常保险的 ...

  8. 如何让自己的Android程序永不被系统kill

    一般来说,在Android系统中,当某进程较长时间不活动,或系统资源比较紧时,该进程可能被系统kill掉,以此来回收一些资源.Android系统会根据进程的优先级来选择性地杀死一些进程,优先级从高到低 ...

  9. 在Android程序中使用已有的SQLite数据库

    已经将这篇文章迁移至 Code问答,你也能够到这里查看这篇文章,请多多关注我的新技术博客CodeWenDa.com 在中文搜索中,没有找到一篇比較好的关于怎样在Android应用中使用自己事先创建好的 ...

随机推荐

  1. Jenkins执行批处理文件、powershell失败

    今天搭建Jenkins持续集成环境,编译环境是.net core.整理了一些发布的命令配置在Jenkins,问题来了,使用powershell插件运行dotnet restore.dotnet bui ...

  2. 多表insert操作详解

    --1.无条件的多表insert all ; ; ; --没有条件,向多个目标表全量插入,必须有all insert all --不指定emp_1后面的列,也不指定values,那么emp_1中的所有 ...

  3. ES6(数据结构_2)

    数据结构—2 Map 与 Array 的对比 Set 与 Array的对比 Map 与 Object 的对比 Set 与 Object 的对比 (增.查.改.删) 一.Map 与 Array 的对比 ...

  4. Java课程设计常见技术问题(程序部署、数据库、JSP)

    1. 部署方法 Eclipse下打包 右键点击项目-Export-Runnable JAR file,选择正确的Launch configuration,接下来根据提示可以将项目中用到的jar打入包中 ...

  5. Lucene查询索引

    索引创建 以新闻文档为例,每条新闻是一个document,新闻有news_id.news_title.news_source.news_url.news_abstract.news_keywords这 ...

  6. Switch控件详解

    Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch" android:layout_widt ...

  7. Android Multimedia框架总结(二十二)MediaCodec中C++中创建到start过程及状态变换

    上一章介绍MediaCodec中创建到start过程(到jni部分),从今天开始,将深入源码中看看其c++过程,看下Agenda如下: mediacodec.h CreateByType initMe ...

  8. 一个环形公路,上面有N个站点,A1, ..., AN,其中Ai和Ai+1之间的距离为Di,AN和A1之间的距离为D0。 高效的求第i和第j个站点之间的距离,空间复杂度不超过O(N)。

    //点数 #define N 10 //点间距 int D[N]; //A1到每个Ai的距离 int A1ToX[N]; void preprocess() { srand(time(0)); //随 ...

  9. EBS业务学习之应收管理

    Oracle Receivable 是功能完备地应收款管理系统,它能够有效地管理客户.发票和收帐过程,因此是财务模块的重要组成部分,是财务系统中较为核心的模块之一.对于一个公司来说,是否能够与客户保持 ...

  10. Java并发框架——AQS之如何使用AQS构建同步器

    AQS的设计思想是通过继承的方式提供一个模板让大家可以很容易根据不同场景实现一个富有个性化的同步器.同步器的核心是要管理一个共享状态,通过对状态的控制即可以实现不同的锁机制.AQS的设计必须考虑把复杂 ...