手段略曲折
<uses-permission android:name="androidpermissionREAD_LOGS" />
然后在你的程序里开一个后台线程,不停的读取log,当你的应用(包括其他任何应用)被卸载时,系统的ActivityManager会打印出一行log,大概是removing:你的包名。这个时机是在卸载界面点击确定后的一瞬间触发的,如下图
之后你的程序不管是进程还是线程都会被杀死。这一瞬间很短,但足够你捕获到,能不能通过网络发送出去你要发的信息就不敢保证了,我反正是没发出去就被杀死了。
还有个时机是在程序管理界面点击卸载按钮跳转卸载界面时会打印一行log,如图:
但是不能保证用户就会点确定真把你的卸载了。。所以自己权衡吧。
这是我在网上找到的唯一方法
代码如下:
private void ListenLog(){
Thread t = new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
Logv("Fuck","Start listening log");
String[] cmds = { "logcat", "-c" };
String shellCmd = "logcat";
Process process = null;
InputStream is = null;
DataInputStream dis = null;
String line = "";
Runtime runtime = RuntimegetRuntime();
try {
int waitValue;
waitValue = runtimeexec(cmds)waitFor();
process = runtimeexec(shellCmd);
is = processgetInputStream();
dis = new DataInputStream(is);
while ((line = disreadLine()) != null && mKeepListenFlag) {
if (!linecontains("Fuck")) {
Logv("Fuck", line);
//这里只是把每个log都打印了一遍,可以再此判断line里是否有removing字样,然后做些处理
}
}
Logv("Fuck","finished listen");
} catch (InterruptedException e) {
eprintStackTrace();
} catch (IOException ie) {
ieprintStackTrace();
} finally {
try {
if (dis != null) {
disclose();
}
if (is != null) {
isclose();
}
if (process != null) {
processdestroy();
}
} catch (Exception e) {
eprintStackTrace();
}
}
}
});
//mKeepListenFlag是个成员变量,是为了让程序结束时终止线程的,否则可能产生程序多次启动,然后这个线程就启动了多个。Android线程可不会因为Activity的退出而终止。
mKeepListenFlag = true;
tstart();
}
intentsetClass(this, SplashActivityclass);Intent addShortcut = new Intent(ACTION_ADD_SHORTCUT);Parcelable icon = IntentShortcutIconResourcefromContext(this,Rdrawableicon);addShortcutputExtra(IntentEXTRA_SHORTCUT_NAME, getString(Rstringapp_name));addShortcutputExtra(IntentEXTRA_SHORTCUT_INTENT, intent);addShortcutputExtra("duplicate", 0);addShortcutputExtra(IntentEXTRA_SHORTCUT_ICON_RESOURCE, icon);sendBroadcast(addShortcut);2:删除图标如下复制代码代码如下:Intent intent = new Intent();intentsetClass(this, SplashActivityclass);intentsetAction("androidintentactionMAIN");intentaddCategory("androidintentcategoryLAUNCHER");Intent addShortcut = new Intent(ACTION_ADD_SHORTCUT);Parcelable icon = IntentShortcutIconResourcefromContext(this,Rdrawableicon);addShortcutputExtra(IntentEXTRA_SHORTCUT_NAME, getString(Rstringapp_name));addShortcutputExtra(IntentEXTRA_SHORTCUT_INTENT, intent);addShortcutputExtra("duplicate", 0);addShortcutputExtra(IntentEXTRA_SHORTCUT_ICON_RESOURCE, icon);sendBroadcast(addShortcut);intentsetAction("androidintentactionMAIN");需要两个过滤属性
1、你确定是原装的系统?据我所知有些非官方的不完善系统会经常FC(报错退出),最常见的FC是CM7系统的系统信息、系统升级选项,一点就FC。
2、你如果想卸载内置软件的话推荐你下载一个叫做“系统卸载器”的小软件,图标是一个垃圾桶。授权最高权限后会罗列所有的程序菜单,都可以卸载,你查查网上的可卸载列表对照着卸,有一部分是不能卸载的,否则系统出问题只能重新刷机。(你要是不想删除软件的话进这个菜单干什么……= =)
也有可能是系统被你精简出错了,针对第一个问题如果你没精力去查找问题原因的话推荐你刷机,一下都解决了。
以上就是关于android程序如何监听到自己被卸载这个事件。全部的内容,包括:android程序如何监听到自己被卸载这个事件。、android如何添加桌面图标和卸载程序后自动删除图标、android 内置软件卸载一打开就自动退出,求解决办法,谢谢.等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)