Android_监听自身应用被卸载
来源:互联网 发布:淘宝退货卡怎么填写 编辑:程序博客网 时间:2024/05/16 13:00
1.通过jni实现函数
//LOG宏定义
#define LOG_INFO(tag, msg) __android_log_write(ANDROID_LOG_INFO, tag, msg)
#define LOG_DEBUG(tag, msg) __android_log_write(ANDROID_LOG_DEBUG, tag, msg)
#define LOG_WARN(tag, msg) __android_log_write(ANDROID_LOG_WARN, tag, msg)
#define LOG_ERROR(tag, msg) __android_log_write(ANDROID_LOG_ERROR, tag, msg)
/* 内全局变量begin */
static
char
c_TAG[] =
"onEvent"
;
static
jboolean b_IS_COPY = JNI_TRUE;
jstring Java_com_example_uninstallself_Observer_register(JNIEnv* env,
jobject thiz, jstring path, jstring url, jint version) {
jstring tag = (*env)->NewStringUTF(env, c_TAG);
//初始化log
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env, (*env)->NewStringUTF(env,
"init OK"
),
&b_IS_COPY));
//fork子进程,以执行轮询任务
pid_t pid = fork();
if
(pid <
0
) {
//出错log
LOG_ERROR((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env,
(*env)->NewStringUTF(env,
"fork failed !!!"
),
&b_IS_COPY));
}
else
if
(pid ==
0
) {
//子进程注册目录监听器
int
fileDescriptor = inotify_init();
if
(fileDescriptor <
0
) {
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env,
(*env)->NewStringUTF(env,
"inotify_init failed !!!"
), &b_IS_COPY));
exit(
1
);
}
int
watchDescriptor;
watchDescriptor = inotify_add_watch(fileDescriptor,
(*env)->GetStringUTFChars(env, path, NULL), IN_DELETE);
if
(watchDescriptor <
0
) {
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env,
(*env)->NewStringUTF(env,
"inotify_add_watch failed !!!"
),
&b_IS_COPY));
exit(
1
);
}
//分配缓存,以便读取event,缓存大小=一个struct inotify_event的大小,这样一次处理一个event
void
*p_buf = malloc(sizeof(struct inotify_event));
if
(p_buf == NULL) {
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env,
(*env)->NewStringUTF(env,
"malloc failed !!!"
),
&b_IS_COPY));
exit(
1
);
}
//开始监听
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env,
(*env)->NewStringUTF(env,
"start observer"
),
&b_IS_COPY));
//read会阻塞进程,
size_t readBytes = read(fileDescriptor, p_buf,
sizeof(struct inotify_event));
//走到这里说明收到目录被删除的事件,注销监听器
free(p_buf);
inotify_rm_watch(fileDescriptor, IN_DELETE);
//目录不存在log
LOG_DEBUG((*env)->GetStringUTFChars(env, tag, &b_IS_COPY),
(*env)->GetStringUTFChars(env,
(*env)->NewStringUTF(env,
"uninstalled"
), &b_IS_COPY));
if
(version >=
17
) {
//4.2以上的系统由于用户权限管理更严格,需要加上 --user 0
execlp(
"am"
,
"am"
,
"start"
,
"--user"
,
"0"
,
"-a"
,
"android.intent.action.VIEW"
,
"-d"
,
(*env)->GetStringUTFChars(env, url, NULL), (
char
*) NULL);
}
else
{
execlp(
"am"
,
"am"
,
"start"
,
"-a"
,
"android.intent.action.VIEW"
,
"-d"
, (*env)->GetStringUTFChars(env, url, NULL),
(
char
*) NULL);
}
//扩展:可以执行其他shell命令,am(即activity manager),可以打开某程序、服务,broadcast intent,等等
}
else
{
//父进程直接退出,使子进程被init进程领养,以避免子进程僵死
}
return
(*env)->NewStringUTF(env,
"Hello from JNI !"
);
}
2.定义UninstallObserver
public
class
UninstallObserver {
static
{
System.loadLibrary(
"observer"
);
}
/***
*
* @param path 需要监听的文件路径,可用 getApplicationContext().getFilesDir().getPath()
* @param url 卸载调转http
* @param version android.os.Build.VERSION.SDK_INT
* @return
*/
public
static
native
String register(String path, String url,
int
version);
}
3.简单使用
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(getApplicationContext(),
getApplicationContext().getFilesDir().getPath() +
","
+ Build.VERSION.SDK_INT,
1
).show();
long
a = System.currentTimeMillis();
String str = UninstallObserver.register(getApplicationContext().getFilesDir().getPath(),
"http://www.baidu.com"
,
android.os.Build.VERSION.SDK_INT);
long
b = System.currentTimeMillis();
Toast.makeText(getApplicationContext(), str+
","
+(b-a),
1
).show();
}
0 0
- Android_监听自身应用被卸载
- Android_监听自身应用被卸载
- android监听应用自身被卸载
- android 如何监听自身应用被卸载
- android监听应用自身被卸载
- android 如何监听自身应用被卸载
- Android研究之监听自身应用被卸载代码实现
- 监听自身APP被卸载
- Android监听自身被卸载与监听其他应用被卸载、安装
- Android监听自身的程序被卸载
- android监听自身被卸载的方法
- Android监听自身被卸载与反馈
- Android监听程序自身被卸载
- 应用监听自身卸载,弹出用户反馈调查(上)
- 监测自身应用被卸载了
- Android监听自身的程序被卸载-LOG监视
- Android NDK开发(八)——应用监听自身卸载,弹出用户反馈调查
- Android NDK开发(八)——应用监听自身卸载,弹出用户反馈调查
- linux的同步机制有哪些?
- 链栈
- Hdu 4916 Count on the path
- Linux下Patch补丁的生成与打补丁命令
- UVA 291 The House Of Santa Claus(DFS算法)
- Android_监听自身应用被卸载
- 思科交换机 路由器配置命令大全
- stm32GPIO的复用
- 配置,编译的体会
- 2014多校2(1002)hdu4872
- hdu1823 二维线段树
- MMX Intrinsics各函数介绍
- 制作CYDIA发布源的DEB文件,详解!
- 空心三角形(2091)