监听app卸载操作 方法二 启动服务

1、监控输出日志接口

/**

*

* 监控输出日志接口

*/

public interface LogcatObserver {

/**

*

* @param info

*            输出的日志信息

*/

public void handleLog(String info);

}

2、继承一个服务

public class LogcatScannerService extends Service implements LogcatObserver {

private String iMEI, simNo, operatorName, simSerialNumber, iMSI, iSO, oSInfo, module, manufacturer, resolution, apps, packageName, versionName,

versionCode;

private DisplayMetrics dm;

private String SourceIdentity = "";// 市场标识

ApplicationInfo appInfo;

private RequestQueue mRequestQueue;

JSONObject params = new JSONObject();

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

new AndroidLogcatScannerThread(this).start();

getUserInfo();

}

@Override

public void handleLog(String info) {

// 如果包含了卸载日志信息时就执行此操作

if (info.contains("android.intent.action.DELETE") && info.contains(getPackageName())) {

long t1 = System.currentTimeMillis();

// getUserInfo();

long t2 = System.currentTimeMillis();

doRequest();

long t3 = System.currentTimeMillis();

System.out.println("总时间==" + (t3 - t1));

System.out.println("请求网络时间==" + (t3 - t2));

}

}

/**

*

* @author 实现输出日志信息的监控

*

*/

private class AndroidLogcatScannerThread extends Thread {

private LogcatObserver mObserver;

public AndroidLogcatScannerThread(LogcatObserver observer) {

mObserver = observer;

}

@Override

public void run() {

String[] cmds = { "logcat", "-c" };

String shellCmd = "logcat";

Process process = null;

InputStream is = null;

DataInputStream dis = null;

String line = "";

Runtime runtime = Runtime.getRuntime();

try {

mObserver.handleLog(line);

int waitValue;

waitValue = runtime.exec(cmds).waitFor();

mObserver.handleLog("waitValue=" + waitValue + "\n Has do Clear logcat cache.");

process = runtime.exec(shellCmd);

is = process.getInputStream();

dis = new DataInputStream(is);

while ((line = dis.readLine()) != null) {

if (mObserver != null)

mObserver.handleLog(line);

}

} catch (InterruptedException e) {

e.printStackTrace();

} catch (IOException ie) {

} finally {

try {

if (dis != null) {

dis.close();

}

if (is != null) {

is.close();

}

if (process != null) {

process.destroy();

}

} catch (Exception e) {

}

}

}

}

/**

* 获取用户信息

*

*

*/

private void getUserInfo() {

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);

iMEI = tm.getDeviceId();

simNo = tm.getLine1Number();

operatorName = tm.getNetworkOperatorName();

simSerialNumber = tm.getSimSerialNumber();

iMSI = tm.getSubscriberId();

iSO = tm.getNetworkCountryIso();

oSInfo = android.os.Build.VERSION.RELEASE;

module = android.os.Build.MODEL;

manufacturer = android.os.Build.MANUFACTURER;

try {

appInfo = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);

SourceIdentity = appInfo.metaData.get("BaiduMobAd_CHANNEL").toString();

PackageInfo info = this.getPackageManager().getPackageInfo(this.getPackageName(), 0);

packageName = info.packageName;

versionName = info.versionName;

versionCode = getResources().getString(R.string.version);

} catch (NameNotFoundException e1) {

e1.printStackTrace();

}

try {

params.put("SourceIdentity", SourceIdentity);

params.put("IMEI", iMEI);

params.put("SimNo", simNo);

params.put("OperatorName", operatorName);

params.put("SimSerialNumber", simSerialNumber);

params.put("IMSI", iMSI);

params.put("OSInfo", oSInfo);

params.put("ISO", iSO);

params.put("Module", module);

params.put("Manufacturer", manufacturer);

params.put("Resolution", resolution);

params.put("apps", apps);

params.put("PackageVersionName", versionName);

params.put("PackageVersionCode", versionCode);

params.put("PackageName", packageName);

params.put("WifiMac", DeviceInfo.getMacAddress(this));

params.put("BluetoothMac", DeviceInfo.getBluetoothAddress(this));

params.put("GuidData", DeviceInfo.filesDirGuid(this));

params.put("GuidSD", DeviceInfo.externalStorageGuid(this));

System.out.println("params=" + params.toString());

} catch (JSONException e) {

e.printStackTrace();

}

}

/**

* 在用户点击卸载时 发送数据

* Config为提交的服务器url

* @return

*/

public boolean doRequest() {

boolean isRequestOK = false;

JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Method.POST, Config, params,

new Response.Listener<JSONObject>() {

@Override

public void onResponse(JSONObject arg0) {

System.out.println("argo=======" + arg0);

}

}, new Response.ErrorListener<JSONObject>() {

@Override

public void onErrorResponse(VolleyError error, JSONObject historyCache) {

}

});

mRequestQueue = Volley.newRequestQueue(this);

mRequestQueue.add(jsonObjectRequest, this);

isRequestOK = true;

return isRequestOK;

}

}

3、在manifest.xml注册服务

4、启动服务

startService(new Intent("com.lapel.uninstallservice.LogcatScannerService"));

时间: 2024-10-31 01:39:39

监听app卸载操作 方法二 启动服务的相关文章

Android NDK开发(八)——应用监听自身卸载,弹出用户反馈调查

转载请注明出处:http://blog.csdn.net/allen315410/article/details/42521251 监听卸载情景和原理分析 1,情景分析 在上上篇博客中我写了一下NDK开发实践项目,使用开源的LAME库转码MP3,作为前面几篇基础博客的加深理解使用的,但是这样的项目用处不大,除了练练NDK功底.这篇博客,我将讲述一下一个各大应用中很常见的一个功能,同样也是基于JNI开发的Android应用小Demo,看完这个之后,不仅可以加深对NDK开发的理解,而且该Demo也可

Android 监听APP进入后台或切换到前台方案对比

在我们开发的过程中,经常会遇到需要我们判断app进入后台,或者切换到前台的情况.比如我们想判断app切换到前台时,显示一个解锁界面,要求用户输入解锁密码才能继续进行操作:我们想判断app切换到后台,记录一下log:或者当用户切换回前台时,我们想刷新一下页面的数据等等...... android里面监听app前后台的方案很多(这还是得归根于安卓提供了丰富的api和强大的架构支撑,呵呵~),比如可以通过ActivityManager提供的getRunningAppProcesses()获取系统当前运

Android实现广播监听HOME键操作

先写了个Service,在服务中通过广播来监听HOME键操作: public class HomeService extends Service{ private MonitoHomeReceiver mHomeBroadcastReceiver; @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { super.onCreate(); mHomeBro

(转)NGUI研究院之三种方式监听NGUI的事件方法

NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不灵活. 1 2 3 4 void OnClick() { Debug.Log("Button is Click!!!"); }   2.使用SendMessage 选择按钮后,在Unity导航菜单栏中选择Component->Interaction->Button Messag

事件监听的三种方法

事件监听的三种方法: addTarget --用于监听一些点击.值改变等事件 代理       -- 监听一些开始.结束.选中某行等一些改变控制属性的一些事件 通知:上面都不行考虑使用通知 通知使用注意:只要监听通知就要移除通知,否则控制器销毁后,通知发送时就会找不到对象导致程序崩溃 文本框事件的监听: textfied代理只能监听开始编辑结束编辑,能否改变文字,不能监听改变文字后的情况,本项目需要 监听文本框中是否有输入,代理和addTarget都不适用. 文本框发出的三个通知: UIKIT_

监听APP升级广播处理

当旧版本的用户升级新版本的时候需要重新设定一些值处理,这时候需要监听升级版本的广播 <receiver android:name=".OnUpgradeReceiver"> <intent-filter> <action android:name="android.intent.action.PACKAGE_REPLACED" /> <data android:scheme="package" />

Android Notification之监听系统清除通知栏方法

编写了一个Notification通知工具类,里面含有监听系统清除通知栏方法,焦点在加粗斜体部分: public class Notifier { private static final String TAG = Notifier.class.getSimpleName(); private static Notifier instance; private Context mContext; private static final int NOTIFICATION_ID_1 = 0; pr

三种方式监听NGUI的事件方法

NGUI研究院之三种方式监听NGUI的事件方法(七) NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定在按钮上,当按钮点击时就可以监听到,这种方法不太好很不灵活. 1 2 3 4 void OnClick() { Debug.Log("Button is Click!!!"); }   2.使用SendMessage 选择按钮后,在Unity导航菜单栏中选择Component->In

Andorid 如何监听app是否安装或卸载

在Android项目中有时会需要用到如何监听到app是否安装或卸载,来做出相应的操作.整个过程也挺简单的 1.写一个类继承BroadcastReceiver public class BootReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { <span style="font-family:微软雅黑;"> //安装广播监听