android实现 彻底退出应用/清除数据/卸载应用的方法

清楚应用数据和卸载应用,直接执行命令:

* String cmd = "pm clear " + packageName; 或者 * String cmd = "pm clear " + packageName  + " HERE";

* String cmd = "pm uninstall " + packageName; 或者 * String cmd = "pm uninstall " + packageName  + " HERE";

* String cmd = "pm install " + apk_path; 或者 * String cmd = "pm uninstall " + apk_path+ " HERE";

且在清楚数据之后应用本身的Service和Alarm定时会自动取消掉,进程也随之结束, 以此类推adb所有命令都可以这样执行。

package com.app.exit.demo;

import java.io.IOException;

import android.util.Log;

/**

* 运行命令管理器

* 等同于在PC端adb shell之后执行命令,pm clear packageName

* 但是只能回自己操作,不能清除其他应用的数据;

* 卸载其他应用(限root设备或者厂商提供接口)

* @author hulk

*

*/

public class RuntimeCmdManager {

private static final String TAG = "RuntimeCmdManager";

/**

* 清除应用缓存的用户数据,同时停止所有服务和Alarm定时task

* String cmd = "pm clear " + packageName;

* String cmd = "pm clear " + packageName  + " HERE";

* Runtime.getRuntime().exec(cmd)

* @param packageName

* @return

*/

public static Process clearAppUserData(String packageName) {

Process p = execRuntimeProcess("pm clear " + packageName);

if (p == null) {

LogTag.log("Clear app data packageName:" + packageName

+ ", FAILED !");

} else {

LogTag.log("Clear app data packageName:" + packageName

+ ", SUCCESS !");

}

return p;

}

/**

* 卸载应用,只能对root设备有效

* String cmd = "pm uninstall " + packageName;

* Runtime.getRuntime().exec("pm uninstall " + packageName)

* @param packageName

* @return

*/

public static Process uninstallApp(String packageName) {

Process p = execRuntimeProcess("pm uninstall " + packageName);

if (p == null) {

LogTag.log("Uninstall app packageName:" + packageName + ", FAILED !");

} else {

LogTag.log("Uninstall app packageName:" + packageName + ", SUCCESS !");

}

return p;

}

public static Process execRuntimeProcess(String commond) {

Process p = null;

try {

p = Runtime.getRuntime().exec(commond);

} catch (IOException e) {

LogTag.log("exec Runtime commond:" + commond + ", IOException" + e);

e.printStackTrace();

}

LogTag.log("exec Runtime commond:" + commond + ", Process:" + p);

return p;

}

}

彻底退出应用,不清除数据的方法:

停止应用中所有Service。调用ActivityManager.killBackgroundProcesses(packageName);

示例:

package com.app.exit.demo;

import java.util.List;

import android.support.v7.app.ActionBarActivity;

import android.app.ActivityManager;

import android.app.AlarmManager;

import android.app.PendingIntent;

import android.app.ActivityManager.RunningServiceInfo;

import android.content.Context;

import android.content.Intent;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.content.pm.ServiceInfo;

import android.os.Bundle;

import android.util.Log;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

private static final String TAG = "MainActivity";

public static final int ALARM_INTERVAL_MILLIS = 10 * 1000;

TextView mMsgTv;

Button exitAppBtn;

List<RunningServiceInfo> runningServices;

ActivityManager mActivityManager;

List<PackageInfo> packageInfos;

ServiceInfo[] serviceInfos;

AlarmManager mAlarmManager;

private PendingIntent operation;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mMsgTv = (TextView) findViewById(R.id.msg_tv);

exitAppBtn = (Button) findViewById(R.id.btn_exit_app);

exitAppBtn.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

finish();

}

});

LogTag.i("" + this);

mAlarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

mActivityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);

startServices();

runningServices = mActivityManager.getRunningServices(10000);

// proccessRunningServices(false);

packageInfos = getPackageManager().getInstalledPackages(

PackageManager.GET_SERVICES);

processPackageInfos(false);

setRepeating();

}

/**

* 定时启动SecondActivity,清除自身数据或者卸载

*/

private void setRepeating() {

if (operation == null) {

operation = getSecondPendingIntent();

}

long startTime = System.currentTimeMillis() + ALARM_INTERVAL_MILLIS;

mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, startTime,

ALARM_INTERVAL_MILLIS, operation);

}

private PendingIntent getSecondPendingIntent() {

Intent intent = new Intent(getApplicationContext(),

SecondActivity.class);

PendingIntent operation = PendingIntent.getActivity(

getApplicationContext(), 0, intent, 0);

return operation;

}

private void startServices() {

startService(new Intent(this, MyService1.class));

startService(new Intent(this, MyService2.class));

}

private void processPackageInfos(boolean isStop) {

for (PackageInfo pinfo : packageInfos) {

if (getPackageName().equals(pinfo.packageName)) {

serviceInfos = pinfo.services;

for (ServiceInfo sinfo : serviceInfos) {

if (isStop) {

boolean result = stopPackageService(this,

getPackageName(), sinfo.name);

Log.w(TAG, "Stop sinfo.name: " + sinfo.name

+ ", result=" + result);

} else {

Log.d(TAG, "sinfo.name: " + sinfo.name);

}

}

}

}

}

private void proccessRunningServices(boolean isStop) {

if (runningServices == null) {

Log.w(TAG, "runningServices is null !! ");

return;

}

for (RunningServiceInfo runningServiceInfo : runningServices) {

String serviceName = runningServiceInfo.service.getClassName();

String process = runningServiceInfo.process;

if ("com.app.exit.demo".equals(process)) {

if (isStop) {

boolean result = stopPackageService(getApplication(),

getPackageName(), serviceName);

Log.w(TAG, "stopService " + serviceName + ", result= "

+ result);

} else {

Log.i(TAG, "runningServiceInfo.process=" + process

+ ",runningServiceInfo.pid="

+ runningServiceInfo.pid

+ ", runningServiceInfo.getClass=" + serviceName);

}

}

}

}

private boolean stopPackageService(Context context, String packageName,

String serviceName) {

Intent service = new Intent();

service.setClassName(packageName, serviceName);

return context.stopService(service);

}

@Override

protected void onDestroy() {

super.onDestroy();

killProcess();

LogTag.i("onDestroy: " + this);

}

private void killProcess() {

// proccessRunningServices(true);

processPackageInfos(true);

String packageName = getPackageName();

mActivityManager.killBackgroundProcesses(packageName);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

// Handle action bar item clicks here. The action bar will

// automatically handle clicks on the Home/Up button, so long

// as you specify a parent activity in AndroidManifest.xml.

int id = item.getItemId();

if (id == R.id.action_settings) {

return true;

}

return super.onOptionsItemSelected(item);

}

}

注意Manifest配置:

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

package="com.app.exit.demo"

android:versionCode="1"

android:versionName="1.0" >

<uses-sdk

android:minSdkVersion="8"

android:targetSdkVersion="21" />

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

<application

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppTheme" >

<activity

android:name=".MainActivity"

android:label="@string/app_name" >

<intent-filter>

<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />

</intent-filter>

</activity>

<activity

android:name=".SecondActivity"

android:label="SecondActivity"

android:launchMode="singleTask" >

</activity>

<service android:name=".MyService1" />

<service android:name=".MyService2" />

</application>

</manifest>

时间: 2024-10-14 10:21:00

android实现 彻底退出应用/清除数据/卸载应用的方法的相关文章

Android中使用Gson解析JSON数据的两种方法

Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率. 从结构上看,所有的数据(data)最终都可以分解成三种类型: 第一种类型是标量(scalar),也就是一个单独的字符串(string)或数字(numbers),比如"北京"这个单独的词. 第二种类型是序列(sequence),也就是若干个相关的数据按照一定顺序并列在一起,又叫做数组

Android一键锁屏和清除数据代码实现

android 2.2引入了支持企业应用程序提供Android设备管理API.设备管理API提供了设备管理功能在系统级别.管理员也可以远程擦(即恢复工厂默认值)丢失或被盗的手机. 但对于实现这些功能需要引入设备超级管理员(device admin),具体2.看文档 Develop-->API Guides--->Administration 下面我们看实现: 首先创建MyAdmin类,继承DeviceAdminReceiver 自己无需实现任何东西 AndroidManifest.xml配置这

android 卸载程序、清除数据、停止服务用法

要实现卸载程序.清除数据.停止正在执行的服务这几大模块,如今将代码粗略总结例如以下: 主要运用到的类有 PackageManager ActivityManager ApplicationInfo RunningServiceInfo Method 还有两个android.pm下的源文件用于生成桩,IPackageStatsObserver.java 和 IPackageDataObserver.java,由名字能够看出,他们是跟包的状态和大小有关的,在网上找到这两个文件的源代码后,把他们放在p

android 卸载程序、清除数据、停止服务使用方法

要实现卸载程序.清除数据.停止正在运行的服务这几大模块,现在将代码粗略总结如下: 主要运用到的类有 PackageManager ActivityManager ApplicationInfo RunningServiceInfo Method 还有两个android.pm下的源文件用于生成桩,IPackageStatsObserver.java 和 IPackageDataObserver.java,由名字可以看出,他们是跟包的状态和大小有关的,在网上找到这两个文件的源码后,把他们放在工程sr

android清除数据后widget无法更新问题修改

清除数据时会发送ACTION_PACKAGE_DATA_CLEARED广播,在widgetProvider里面监听该广播并进行处理就可以了 public static class PackageDataClearedReceiver extends BroadcastReceiver { private static final String ACTION_PACKAGE_DATA_CLEARED = "com.mediatek.intent.action.SETTINGS_PACKAGE_DA

Android实现多次闪退清除数据

背景 很多时候由于后台返回的数据异常,可能会导致App闪退.而如果这些异常数据被App本地缓存下来,那么即使杀掉进程重新进入还是会发生闪退.唯一的解决方法就是清除App数据,但是用户可能没有这个意识或者嫌麻烦就直接不再使用了,这是我们无法接受的.在使用淘宝.追书神器等App时我发现有时候它们也会连续闪退,但是往往闪退三次后就恢复正常了,所以一般成熟的App都会做连续闪退三次后清除缓存数据的工作.而目前笔者搜不到有哪篇blog来讲这方面的事情,所以就姑且由我来讲讲此事,为希望提高App用户体验的朋

Android开发7:简单的数据存储(使?SharedPreferences)和文件操作

前言 啦啦啦~大家好,又见面啦~ 本篇博文讲和大家一起完成一个需要注册.登录的备忘录的,一起学习 SharedPreferences 的基本使用,学习 Android 中常见的文件操作方法,复习 Android 界面编程. 直接进入正题~ 基础知识 1.SharedPreferences 的使用 使用SharedPreferences储存用户名和密码,SharedPreferences是直接处理xml文件,不需要做字符串分割,存储效率会比使用内部存储,和外部存储存储用户名和密码高. (1) Sh

Android基础:常用布局和数据存储

1. 相对布局RelativeLayout 特点:相对布局所有组件可以叠加在一起:各个组件的布局是独立的,互不影响:所有组件的默认位置都是在左上角(顶部.左部对齐) 属性 功能描述 android:layout_toRightOf 在指定控件的右边 android:layout_toLeftOf 在指定控件的左边 android:layout_above 在指定控件的上边 android:layout_below 在指定控件的下边 android:layout_alignBaseline 跟指定

服务器下架清除数据

在IDC的租用的一台远程服务器要到期了准备下架了,归还设备了.下架前必须清除数据,保障公司原数据安全不外泄. 1.备份数据(通过rsync.ftp等方式备份,在此就不详细介绍了) 2.关闭运行服务 3.卸载并格式化非系统分区 4.删除系统分区配置及文件 以下是过程: 1.通过ssh远程登录服务器,查看运行服务: [[email protected] local]# chkconfig --list|grep ":on" blk-availability0:off1:on2:off3:o