2013-12-20 53 views
4

我參考了this信息。應用程序卸載時無法獲取接收器

我編寫了相同的程序,但是當我點擊卸載按鈕時,我無法獲得任何日誌信息。

我附上我的代碼如下。有沒有人知道這段代碼有什麼問題?

我想在使用點擊卸載按鈕時做點什麼。也許喜歡打開瀏覽器等。

有沒有人可以幫我一把嗎?

這個問題困擾了我很長一段時間。

我AndroidManifest:

...

<uses-permission android:name="android.permission.GET_TASKS" /> 
<uses-permission android:name="android.permission.RESTART_PACKAGES"/> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
<receiver android:name=".UninstallIntentReceiver" > 
     <intent-filter> 
      <action android:name="android.intent.action.QUERY_PACKAGE_RESTART" /> 
      <action android:name = "android.intent.action.PACKAGE_REMOVED" /> 
      <action android:name = "android.intent.action.PACKAGE_ADDED" /> 
      <data android:scheme="package"></data> 
     </intent-filter> 
    </receiver> 
</application> 

...

我的廣播接收器下面的代碼:

public class UninstallIntentReceiver extends BroadcastReceiver{ 

@Override 
public void onReceive(Context context, Intent intent) { 

    String [] packageNames = intent.getStringArrayExtra("android.intent.extra.PACKAGES"); 
    if(packageNames!=null){ 
     for(String packageName: packageNames){ 
      if(packageName!=null && packageName.equals("yu.idv.uninstalldetected")){ 
       Log.i("info", "00000000"); 
       new ListenActivities(context).start(); 
       Log.i("info", "11111111"); 

      } 
     } 
    } 
    } 

} 

class ListenActivities extends Thread{ 
boolean exit = false; 
ActivityManager am = null; 
Context context = null; 

public ListenActivities(Context con){ 
    context = con; 
    am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
} 

public void run(){ 

    Looper.prepare(); 

    while(!exit){ 

     List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(MAX_PRIORITY); 

     String activityName = taskInfo.get(0).topActivity.getClassName(); 


     Log.i("info", "======CURRENT Activity =======::" 
       + activityName); 

     if (activityName.equals("com.android.packageinstaller.UninstallerActivity")) { 
      exit = true; 
      Log.i("info", "2222222222");     
      Toast.makeText(context, "Done with preuninstallation tasks... Exiting Now",   Toast.LENGTH_SHORT).show(); 
     } else if(activityName.equals("com.android.settings.ManageApplications")) { 
      exit=true; 
      Log.i("info", "33333333333"); 
     } 
    } 
    Looper.loop(); 
} 
+0

挑戰你知道,如果你的'BroadcastReceiver'被稱爲呢?添加一些日誌記錄來查看它是否被調用。 –

+0

我在onReceive中添加了日誌。但是當我點擊卸載按鈕時,我沒有得到任何日誌。 :( – dickfala

+0

如何在沒有任何啓動程序的情況下運行你的應用程序? –

回答

0

一般來說,當你卸載應用程序,所有資源從設備中刪除。因此在卸載時您不能觸發任何操作

+0

如果檢測到用戶單擊卸載按鈕(不卸載),應用程序可以在logcat中記錄程序包名稱,我們可以使用logcat info parse packagename我認爲引用的意思是[this](http://stackoverflow.com/questions/18692571/how-it-works-warning-that-app-is-going-to-be-uninstalled)。但我可以't實施@@。 – dickfala

+0

它就像我們需要自定義卸載意圖操作 –

+0

你可以發佈如何自定義卸載意圖操作嗎?我真的需要學習如何實現。非常感謝你。 – dickfala

1

您的BroadcastReceiver未被調用的原因是您的應用程序仍處於「停止狀態」。您的應用程序沒有任何Activity組件。這意味着在安裝應用程序之後,用戶無法啓動它。從未由用戶啓動的應用程序保持「停止狀態」。在「停止狀態」中的應用程序將不會收到廣播意圖

參見「關於停止應用程序啓動控制」一節中http://developer.android.com/about/versions/android-3.1.html


編輯:在安卓4.x的

看來,這種行爲已經改變了關於添加更多Intent.ACTION_QUERY_PACKAGE_RESTART細節Android 2.3(我不確定Android 3.x)。在Android 4.0以上,在InstalledAppDetails(設置應用程序的一部分)的代碼看起來是這樣的:

private void checkForceStop() { 
    if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { 
     // User can't force stop device admin. 
     updateForceStopButton(false); 
    } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { 
     // If the app isn't explicitly stopped, then always show the 
     // force stop button. 
     updateForceStopButton(true); 
    } else { 
     Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, 
       Uri.fromParts("package", mAppEntry.info.packageName, null)); 
     intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); 
     intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); 
     getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, 
       Activity.RESULT_CANCELED, null, null); 
    } 
} 

因此,如果正在顯示的應用程序是一個設備管理中,「強制停止」按鈕將被禁用。如果顯示的應用程序是未停止,則將啓用「強制停止」按鈕。 否則,將播放Intent.ACTION_QUERY_PACKAGE_RESTART

這意味着Intent將僅針對已停止的非設備管理應用程序進行廣播。

我用4.0代碼在4.0設備上測試過這個。如果你安裝你的應用程序,那麼你去Settings->Apps並選擇另一個應用程序(不是你的)已被「強制停止」,你的onReceive()被稱爲Intent.ACTION_QUERY_PACKAGE_RESTART

我意識到這可能沒有太大的幫助,但它至少可以解釋你所看到的行爲。

對不起了這麼久來解決這個問題,並感謝:-)

+0

我曾嘗試添加活動。但是我仍然無法接收廣播內容。@@ dickfala

+0

實際啓動應用程序(即:啓動活動)安裝應用程序後? –

+0

是的,我已經啓動了我的活動。我附上我的源代碼網站。 https://www.dropbox.com/s/0bgbcfn0a0gfoe3/UninstallDetected.zip :( – dickfala