android 如何監聽自身應用被解除安裝
前段時間有個同事問我android應用在解除安裝以後,如何能夠通知一下伺服器,讓使用者填寫一下解除安裝的原因,以求為將來的應用修改積累資料。當時他是有段原始碼的,但是有點小問題,我只是幫他定位一下了程式碼的問題,具體細節沒有研究。又加上最近工作比較繁忙,所以就放下來了,今天稍微有點空,就自己做了一個應用demo,告知一下諸位在android中如何做到監聽自身應用被解除安裝了。
一 效果演示
開啟應用效果圖:
圖1
點選解除安裝後提示,如下圖:
圖2
然後退出應用,解除安裝程式,會發現當應用被解除安裝以後,會彈出呼叫瀏覽器的提示,這裡隨便放了一個搜狐瀏覽頁面,在自己的應用中應該呼叫的一般都是調查頁面。如下圖:
圖3
ok,效果前面已經演示了,現在需要討論一下其具體實現了。
首先,通過adb shell進入手機,然後第一次進入應用,像圖1一樣,不點選按鈕,通過 ps | busybox grep ubuntu 看這個應用的程序資訊,如下圖:
這個時候只有
u0_a108 2953 124 490956 47792 ffffffff 40052a40 S com.example.ubuntuforandroid
2953 這一個程序
點選 解除安裝後提示 按鈕再次,執行剛才執行的ps命令,發現已經有兩個程序瞭如下圖:
其實新產生的程序是通過程式呼叫jni介面
1 |
public static native int Reguninstall( String path, String url);
|
這個介面fork了一個程序,而新fork的程序負責監聽本應用是否被解除安裝了
二 原始碼分析
java層的程式碼如下,很簡單,就是呼叫一下jni介面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
protected void onCreate(Bundle
savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initInjectFunction( "testfile" );
test
= (TextView) this .findViewById(R.id.testview);
test.setText( "點選解除安裝後提示按鈕,你的應用在解除安裝以後會呼叫瀏覽器,然後呼叫你需要的頁面。" );
btn
= (Button) this .findViewById(R.id.testbtn);
btn.setOnClickListener( new View.OnClickListener()
{
@Override
public void onClick(View
v) {
//
TODO Auto-generated method stub
String directory
= MainActivity. this .getFilesDir().getAbsolutePath();
String url
= "http://www.sohu.com/" ;
|