美文网首页
Android中NDK监听自身App卸载后跳出网页

Android中NDK监听自身App卸载后跳出网页

作者: 依玲之风 | 来源:发表于2017-07-13 17:05 被阅读0次

    我们知道在Android中要监听自身App被卸载是没有办法实现的,只能监听第三方的App卸载,而且只能监听系统广播才能实现监听第三方App的卸载。那么我们要监听自身的卸载情况,只能用NDK来实现了。

    首先用NDK来监听App的卸载有很多种方法,在这里我只介绍最简单的方法来实现,通过在C中开一个独立线程来监听我的App有没有被卸载,用一个定时器每隔1秒钟就去查询一下当前的App在data/data下还存在不,来实现该功能:

    据体代码实现如下:


    void java_com_example_appuninstall_MainActivity_UninstallListener(JNIEnv* env,

    jobject obj, jstring packageName, jstring url) {

    int code = fork(); //开启子线程监听App目录

    int isStop = 1;

    if (code > 0) {

    } else if (code == 0) {

    while (isStop) {

    sleep(1);

    char* packagename = Jstring2CStr(env, packageName);

    char* url = Jstring2CStr(env, url);

    //FILE *fopen(const char *, const char *);

    FILE *fileName = fopen(packagename, "r");

    if (fileName == NULL) {

    //说明此App已经被卸载,要弹出一个网页

    execlp("am", "am", "start", "-a", "android.intent.action.VIEW",

    "-d", url, (char*) NULL);

    }

    }

    }

    }

    上面的方法中packageName是指App安装所在的全路径,url是卸载后要跳转的网页链接

    在此附上JNI中很有用的jstring 与 const char* 转换函数

    char* Jstring2CStr(JNIEnv* env, jstring jstr) {

    char* rtn = NULL;

    jclass clsstring = (*env)->FindClass(env, "java/lang/String");

    jstring strencode = (*env)->NewStringUTF(env, "GB2312");

    jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes",

    "(Ljava/lang/String;)[B");

    jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(env, jstr, mid,

    strencode); // String .getByte("GB2312");

    jsize alen = (*env)->GetArrayLength(env, barr);

    jbyte* ba = (*env)->GetByteArrayElements(env, barr, JNI_FALSE);

    if (alen > 0) {

    rtn = (char*) malloc(alen + 1); //"\0"

    memcpy(rtn, ba, alen);

    rtn[alen] = 0;

    }

    (*env)->ReleaseByteArrayElements(env, barr, ba, 0); //

    return rtn;

    }

    好了,上面的功能就全部实现了,如果你有更容易或更好的方法可以留言。

    需要demo的也可以联系我。

    相关文章

      网友评论

          本文标题:Android中NDK监听自身App卸载后跳出网页

          本文链接:https://www.haomeiwen.com/subject/czzwhxtx.html