在android app开发中,有的时候会有这样的需求,就是当用户卸载了我们的app的时候,如果可以搜集用户的反馈信息,那样是极好的,今天带大家手把手实现这样的功能,先说下原理:我们的app在安装的时候会在/data/data/报名,下生成这样的文件夹,一旦我们的应用被卸载,那么该文件夹同样会被移除,因此,我们可以通过利用底层c代码不断地查询该文件夹是否来存在,来判断app是否被卸载。

声明native方法


这里创建一个NativeClass来生命一个本地方法,代码如下:

package com.example.uninstallprompt;public class NativeClass {public native String init();}

生成.h头文件

在生成头文件之前,首先需要生成.class文件

生成.h头文件

注意这里的格式是:javah -classpath src路径 -jni 包名.类名称
此时会在src路径下生成.h头文件

内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_uninstallprompt_NativeClass */#ifndef _Included_com_example_uninstallprompt_NativeClass
#define _Included_com_example_uninstallprompt_NativeClass
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     com_example_uninstallprompt_NativeClass* Method:    init* Signature: ()Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_com_example_uninstallprompt_NativeClass_init(JNIEnv *, jobject);#ifdef __cplusplus
}
#endif
#endif

编写c代码

在android工程中新建一个jni目录,并且在该目录下新建一个uninstall-jni.c文件,将刚才生成的.h文件的内容拷贝进来。并且将生成的"com_example_uninstallprompt_NativeClass.h"文件拷贝到该文件夹下。
uninstall-jni.c内容如下:

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <android/log.h>
#include <unistd.h>
#include <sys/inotify.h>#include "com_example_uninstallprompt_NativeClass.h"/* 宏定义begin */
//清0宏
#define MEM_ZERO(pDest, destSize) memset(pDest, 0, destSize)#define LOG_TAG "onEvent"//LOG宏定义
#define LOGD(fmt, args...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, fmt, ##args)JNIEXPORT jstring JNICALL Java_com_example_uninstallprompt_NativeClass_init(JNIEnv* env, jobject thiz) {//初始化logLOGD("init start...");//fork子进程,以执行轮询任务pid_t pid = fork();if (pid < 0) {//出错logLOGD("fork failed...");} else if (pid == 0) {//子进程注册"/data/data/com.example.uninstallprompt"目录监听器int fileDescriptor = inotify_init();if (fileDescriptor < 0) {LOGD("inotify_init failed...");exit(1);}int watchDescriptor;watchDescriptor = inotify_add_watch(fileDescriptor,"/data/data/com.example.uninstallprompt", IN_DELETE);LOGD("watchDescriptor=%d",watchDescriptor);if (watchDescriptor < 0) {LOGD("inotify_add_watch failed...");exit(1);}//分配缓存,以便读取event,缓存大小=一个struct inotify_event的大小,这样一次处理一个eventvoid *p_buf = malloc(sizeof(struct inotify_event));if (p_buf == NULL) {LOGD("malloc failed...");exit(1);}//开始监听LOGD("start observer...");size_t readBytes = read(fileDescriptor, p_buf,sizeof(struct inotify_event));//read会阻塞进程,走到这里说明收到目录被删除的事件,注销监听器free(p_buf);inotify_rm_watch(fileDescriptor, IN_DELETE);//目录不存在logLOGD("uninstall");//执行命令am start -a android.intent.action.VIEW -d http://shouji.360.cn/web/uninstall/uninstall.html//execlp(// "am", "am", "start", "-a", "android.intent.action.VIEW", "-d",//    "http://shouji.360.cn/web/uninstall/uninstall.html", (char *)NULL);//4.2以上的系统由于用户权限管理更严格,需要加上 --user 0execlp("am", "am", "start", "--user", "0", "-a","android.intent.action.VIEW", "-d", "https://www.baidu.com",(char *) NULL);} else {//父进程直接退出,使子进程被init进程领养,以避免子进程僵死}return (*env)->NewStringUTF(env, "Hello from JNI !");
}

这里我在该应用被卸载的时候跳转到百度的主界面。

编写Android.mk文件

在刚才新建的jni目录下新建一个Android.mk文件,内容如下:

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := uninstall-jni
LOCAL_SRC_FILES := uninstall-jni.cLOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lloginclude $(BUILD_SHARED_LIBRARY)

说明一下:
LOCAL_MODULE := uninstall-jni 表示编译出来的模块,这个模块名称是随意给的,在java文件红引入的时候需要和该名称相同,不过一般和需要编译的.c文件名称保持一致。
LOCAL_SRC_FILES := uninstall-jni.c 表示需要编译的.c文件

编译c代码


可以看到,这里首先进入工程的根目录,然后执行ndk-build编译该工程中Android.mk中声明的c代码。编译完成可以看到在工程中多了如下文件夹和文件。

这里,如果有哪些步骤不是很清楚,或者是不太懂的地方,可以看我的另一篇博客一步一步学习androidNDK编程(hello world)

ok,现在安装以后,在卸载该app的时候,会弹出浏览器自动跳转到百度的主页面。

源码下载
好了,今天就到这里了,希望大家能够喜欢。

欢 迎 关 注 我 的 公 众 号 “编 程 大 全”

专注技术分享,包括Java,python,AI人工智能,Android分享,不定期更新学习视频

android app卸载以后弹出用户反馈界面相关推荐

  1. android 用户反馈界面,如何通过用户反馈实现产品优化——以「foodie」APP为例

    用户反馈尤其是低分评价,非常需要产品方注意和甄别.通过分析用户反馈,可以更好地了解产品自身.竞品威胁以及未来的机会点等,从而帮助产品更高效地迭代.本文以「foodie」为例,阐述了如何有效搜集用户反馈 ...

  2. android 输入法更换_一种动态切换Android系统输入法的弹出模式的方法与流程

    本发明涉及一种Android系统利用动态切换输入法的弹出模式解决输入法跳闪抖动问题的方法,属于安卓系统技术领域. 背景技术: 随着Android系统的快速发展以及安卓手机的不断普及,基于Android ...

  3. Android编程:底部弹出输入框

    Android编程:底部弹出的对话框 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境: 主机:WIN10 开发环境:Android Studio ...

  4. WindowManager解析(二)Android悬浮框无法弹出输入法的原因和无需权限显示悬浮窗

    Android悬浮框无法弹出输入法 最近要研究悬浮窗方面的东西,遇到一个问题,我的悬浮窗里面有一个输入框,但是不弹出输入法,后来找到一个方法: 在WindowManager的实例获取方式不对,之前是这 ...

  5. android 输入法键盘弹出与否判断和输入法键盘弹出时将界面滚动到指定位置

    本文章重点谈下如何实现,结合以下demo,来谈谈输入法键盘弹出与否判断和输入法键盘弹出时将界面滚动到指定位置 1.先看下demo的场景,这是个登录界面,因为界面元素比较多,导致在输入法弹出时,下面的登 ...

  6. android studio菜单自动弹出,Android实现微博菜单弹出效果

    先上Android仿微博菜单弹出效果图,这个截图不是很流畅,大家可以下载apk试一下. 说一下实现思路: 1.截取当前窗口,对图片做高斯模糊处理,将处理后的图片做popupwindow的背景图片: 2 ...

  7. android APP隐私政策弹框的实现代码实例

    android APP隐私政策弹框的实现代码实例 步骤一:在assets目录下放置隐私政策的文本文件,比如privacy.txt 步骤二:在drawable目录下放置圆角弹出框演示: <?xml ...

  8. android 微博底部弹出,Android实现微博菜单弹出效果

    Android实现微博菜单弹出效果 发布时间:2020-08-23 07:48:12 来源:脚本之家 阅读:89 作者:gqdy365 先上Android仿微博菜单弹出效果图,这个截图不是很流畅,大家 ...

  9. win7如何设置某个软件不弹出用户账户控制

    手动修改注册表: 在 HKEY_CURRENT_USERS\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers 键下面 ...

  10. Android判断软键盘弹出并隐藏的简单完美解决方案

    Android判断软键盘弹出并隐藏的简单完美解决方案 参考文章: (1)Android判断软键盘弹出并隐藏的简单完美解决方案 (2)https://www.cnblogs.com/thare1307/ ...

最新文章

  1. mybatis 注解和xml同时实现
  2. Python的subprocess子进程和管道进行交互
  3. javascript优化--13模式1(DOM和浏览器模式)
  4. boost::fusion::make_unfused用法的测试程序
  5. compat mysql51 5.1_MySQL mysql-5.1升级到mysql-5.6
  6. 工厂方法模式_1天1个设计模式——工厂方法模式
  7. 智能会议系统(17)--- Linphone用户注册
  8. linux 内核模块 定时器,linux内核定时器__backup_timer_hour_struct_定时器_模块__169IT.COM...
  9. 计算机科学型计算器,全能科学型计算器app
  10. 实训笔记20190807--数据分析
  11. DA14580蓝牙硬件系统总览(二)
  12. 命令启动oracle实例,【单选题】启动oracle数据库实例的命令是
  13. 实训六 思科路由器配置静态路由
  14. u盘上传百度网盘照片显示服务器错误,百度云上传文件失败怎么办-百度云上传文件失败的解决方法 - 河东软件园...
  15. Windows运行机理——消息与消息队列
  16. jre包括jvm和java核心类库_JDK、JRE、JVM分别是什么及它们之间的有什么关联
  17. 你的名字烂大街了吗?数据揭开国人起名背后的秘密……
  18. 服务器系统共享文件,服务器操作系统文件共享设置
  19. 游戏服务器 协议 安全问题,游戏服务器开发安全问题
  20. 第2章 SystemVerilog断言

热门文章

  1. 达人评测 联想YOGA Duet 2021
  2. 2022华为机试真题 C++ 实现【数大雁】
  3. java登录界面圆形头像_Bootstrap实现圆角、圆形头像和响应式图片
  4. 李白打酒递归java_李白打酒递归
  5. 大白菜备份还原linux,大白菜pe手动gho镜像还原,大白菜制作ghost镜像
  6. 【记坑】大白菜或老毛桃制作U盘后BIOS找不到系统
  7. python地图制作 - pyecharts(1.9.1)绘制各城市地图
  8. Spring Security Encoded password does not look like BCrypt
  9. arduino(14):使用ESP8266加蜂鸣器,自己动手做歌曲,使用python 程序,做简单的五线谱转换。直接把音节和节拍转换,然后转换成数据,用蜂鸣器播放歌曲《下山》。。
  10. Nginx的 MIME TYPE问题导致的mjs文件加载出错的问题解决