文档章节

Android APP卸载守护,双APP相互守护

老牟
 老牟
发布于 2015/03/21 16:15
字数 531
阅读 1708
收藏 71

介绍一种当用户或者其他软件卸载你的应用时,其守护应用守护该应用重新安装至系统的方案。


方案缺点:

1、当具有root权限的删除时无法守护 (rm data/app/*.apk)

2、当为非root手机时,采用显示安装,用户可选择取消安装

方案优点:

1、使用传统手法卸载软件时具有root权限时可顽固守护

2、双应用守护,无法卸载其中任何一个


方案原理:

采用BroadcastReceiver 接收拦截的应用卸载的消息,(由于系统原因,当接收到消息时,系统已经卸载了该应用才发出的消息,所以无法像短信拦截一样直接拦截)。

1、 接收到应用卸载信息

2、判断包名是否为需要守护的包名

3、如果是则启动重新安装

4、使用静默安装

5、如果失败使用普通安装


方案代码:

BroadcastReceiver

public class ProtectReceiver extends BroadcastReceiver {
	private static final String TAG = "ProtectReceiver";
	private String ACTION_PACKAGE_REMOVED = "android.intent.action.PACKAGE_REMOVED";
	private String PRO_APK_PATH = "/sdcard/test.apk"; //需修改

	@Override
	public void onReceive(Context context, Intent intent) {
		if (ACTION_PACKAGE_REMOVED.equals(intent.getAction())) {
		        //需修改
			if ("package:com.rapida.test".equals(intent.getDataString())) {
				reInstallApp(context);
			}
		}
	}

	private void reInstallApp(Context context) {
		if (!installSlient(context, PRO_APK_PATH)) {
			install(context, PRO_APK_PATH);
		}
	}

	private void install(Context context, String filePath) {
		Intent i = new Intent(Intent.ACTION_VIEW);
		i.setDataAndType(Uri.parse("file://" + filePath),
				"application/vnd.android.package-archive");
		i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		context.startActivity(i);
	}

	private boolean installSlient(Context context, String filePath) {
		String[] args = { "pm", "install", "-r", filePath };
		ProcessBuilder processBuilder = new ProcessBuilder(args);

		Process process = null;
		BufferedReader successResult = null;
		BufferedReader errorResult = null;
		StringBuilder successMsg = new StringBuilder();
		StringBuilder errorMsg = new StringBuilder();
		boolean result = false;
		try {
			process = processBuilder.start();
			successResult = new BufferedReader(new InputStreamReader(
					process.getInputStream()));
			errorResult = new BufferedReader(new InputStreamReader(
					process.getErrorStream()));
			String s;

			while ((s = successResult.readLine()) != null) {
				successMsg.append(s);
			}

			while ((s = errorResult.readLine()) != null) {
				errorMsg.append(s);
			}
		} catch (IOException e) {
			e.printStackTrace();
			result = false;
		} catch (Exception e) {
			e.printStackTrace();
			result = false;
		} finally {
			try {
				if (successResult != null) {
					successResult.close();
				}
				if (errorResult != null) {
					errorResult.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			if (process != null) {
				process.destroy();
			}
		}

		if (successMsg.toString().contains("Success")
				|| successMsg.toString().contains("success")) {
			result = true;
		} else {
			result = false;
		}

		return result;
	}

添加权限

<uses-permission android:name="android.permission.INSTALL_PACKAGES" />

添加receiver

<receiver android:name=".ProtectReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
</receiver>


程序应用:

在需要守护的应用里添加如上代码,因为是相互守护,需要在两个应用里都添加如上代码。


© 著作权归作者所有

共有 人打赏支持
老牟
粉丝 14
博文 20
码字总数 8401
作品 0
成都
程序员
私信 提问
加载中

评论(9)

myml
myml
没什么用的吧?
root用户你拦不住,
不是root,不能静默安装可以直接取消安装
老牟
老牟

引用来自“梁金堂”的评论

如果没root,根本没意思。当然,多个应用一起装,可以互相启动后台
要root,才能静默安装。
梁金堂
梁金堂
如果没root,根本没意思。当然,多个应用一起装,可以互相启动后台
老牟
老牟

引用来自“wfifi”的评论

貌似耍流氓啊
用户不可能同时卸载两个应用,所以就此消彼长。
老牟
老牟

引用来自“hzg625”的评论

不好
是的,有缺陷,已标明
爱迪生与钢弹战士
爱迪生与钢弹战士
中国简直就是用户体验的天堂
wfifi
wfifi
貌似耍流氓啊
hzg625
hzg625
不好
吞鱼小王子
吞鱼小王子
百度跟阿里
2018年Android的保活方案效果统计

一、常见保活方案 1、监听广播:监听全局的静态广播,比如时间更新的广播、开机广播、解锁屏、网络状态、解锁加锁亮屏暗屏(3.1版本),高版本需要应用开机后运行一次才能监听这些系统广播,...

codeGoogle
10/30
0
0
那些年Android黑科技①:只要活着,就有希望

“黑科技什么的最喜欢了! 对,我们就是要搞事。 来呀。谁怕谁。三年血赚,死刑不亏。(๑´ڡ`๑) ” -- 来自暗世界android工程师 前言: 这个世界上手机有三大系统,苹果、 安卓、 中国安卓 ...

猴亮屏
2017/10/24
0
0
那些年Android黑科技③:干大事不择手段

“我在发抖么? 你开什么玩笑。我只是在跳愉快的尬舞。 暗影是不会向邪恶势力低头的。 万岁(≧▽≦)/!!” -- 来自暗世界android工程师 前言: 本篇是本系列的最后一个篇章。其实这些活儿也...

猴亮屏
2017/10/24
0
0
Android Bluetooth opp package 学习笔记

一、背景及相关知识学习 1、Android Bluetooth SDK 首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <use......

sflfqx
2013/03/12
0
0
Android源码学习之八—系统启动过程

Android源码数量庞大,虽然对它的学习从未停止,但是整理成这样的文字,实在是费时费力的一件事情,不过好在前文已经对其基本机制加以分析,相信以此为基础,其他的内容学习起来就没那么困难...

晨曦之光
2012/03/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

降压变换器 Buck

特点 输入输出极性相同。 工作过程 在 MOS 导通时,输入电源通过 L 和 C 滤波后向负载端提供电流;当 MOS 断开后,L 通过二极管续流,保持负载电流连续。输出电压因为占空比的作用,不会超过...

colinux
今天
1
0
Apache日志不记录访问静态文件,访问日志切割,静态元素过期时间设置

Apache配置不记录访问静态文件的日志 网站大多元素为静态文件,如图片、css、js等,这些元素可以不用记录 vhost原始配置 <VirtualHost *:80> ServerAdmin test@163.com DocumentRoo...

野雪球
今天
3
0
聊聊storm的ICommitterTridentSpout

序 本文主要研究一下storm的ICommitterTridentSpout ICommitterTridentSpout storm-core-1.2.2-sources.jar!/org/apache/storm/trident/spout/ICommitterTridentSpout.java public interface......

go4it
今天
4
0
Ubuntu常用操作

查看端口号 netstat -anp |grep 端口号 查看已使用端口情况 netstat -nultp(此处不用加端口号) netstat -anp |grep 82查看82端口的使用情况 查找被占用的端口: netstat -tln netstat -tl...

hc321
昨天
4
0
网站cdn的静态资源突然访问变的缓慢,问题排查流程

1.首先我查看了一下是否自己的网络问题,通过对比其他资源的访问速度和下载速度,确认不是 2.通过ping 和 tracert 判断cdn域名能否正常访问,(最后回想感觉这一步可以省略,因为每次最终能访...

小海bug
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部