2012-04-20 35 views
3

我想要這樣的事情,當我的應用程序將安裝在Android手機。沒有任何人可以從手機上卸載它,或者任何人都會試圖卸載它,彈出一個節目或任何提醒。 有什麼辦法嗎?在android中禁用應用程序unistall?

+2

你不想讓別人從手機上卸載你的應用程序?可怕的... – 2012-04-20 06:37:21

+0

是他們設備管理員的任何方式。 意思是如果用戶在android中安裝應用程序,其他用戶無法從該設備刪除該應用程序? – 2012-04-20 06:41:38

+1

等待這個人..有時手機不是由那些使用它的人擁有..如果我擁有一家公司,並希望我的員工使用我爲他們製作的應用程序,那麼如果他們沒有安裝,我會非常惱火它。認爲停車票的人,銷售人員,送貨人員。我擁有硬件,我說你使用它。 – baash05 2012-04-20 06:43:48

回答

0

我目前認爲您可以完成此操作的唯一方法是使用兩個應用程序。

  1. 是主人..它作爲服務運行,檢查是否安裝了應用程序
    並在缺失時安裝它。
  2. 是您希望用戶看到

好的應用..嗯,我可以想其他辦法。作爲Blessenm說,改變操作系統..但是,假設你的目標硬件的特定位。

您可能可以根系統,並可以讓您訪問管理的想法..不知道它是否會工作。

1

理論上,您可以將手機「root」,將您的應用程序添加到系統分區(用戶無法修改系統分區),然後再次「取消root」。不過,我不確定這是否適用於所有型號。有些設備不能「未紮根」。

+0

嗯,你能解釋如何根電話。是指所有的android製造商允許它?如果不是那個知道製造商提供此功能? – 2012-04-20 07:46:05

+1

爲每個設備製造商開通手機可能是一個非常具體的過程。我不認爲有一個教程涵蓋所有不同的作品。恐怕您必須爲Google提供特定說明。我知道索尼愛立信(Sony Mobile now-a-days)在他們的生根方式上非常自由(他們在他們自己的開發者論壇中有一個非常有幫助的社區)。 – dbm 2012-04-20 10:57:55

+0

非常感謝Mr.dbm :)非常感謝您的時間。 – 2012-04-20 11:17:44

7

您需要啓用deviceAdmin才能禁用Force StopUninstall功能。這由處理企業/應用策略管理的Device Admin API處理。

+0

該怎麼做? – 2015-07-17 07:33:41

+0

您可以分享Device Admin API的示例代碼來使用此功能嗎? – 2016-12-08 12:57:37

2

明確禁用是不可能的。但是,您可以爲此使用解決方法。 創建自己的應用服務,堅持不懈地在後臺運行:

//MasterService.java 
public class MasterService extends Service{ 

    private ThreadPoolExecutor executor; 
    private Runnable runnable = new Runnable(){ 
     @Override 
     public void run(){} 
    }; 

    public MasterService(){ 
     executor = new ThreadPoolExecutor(1, 1, 1, TimeUnit.SECONDS, 
         new LinkedBlockingQueue<Runnable>()); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     executor.execute(runnable); 
     return super.onStartCommand(intent, flags, startId); 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     executor.shutdown(); 
    } 

}; 

不要忘了與startService(new Intent(this, MasterService.class));啓動和出口,並啓用了您的清單申報。

Android爲了卸載應用程序(在無根電話上)運行包管理器。 在您的Runnable中,您需要檢測包管理器是否在前臺運行。如果是的話,使用視圖啓動這需要輸入焦點的活動:

//MasterService.java (inside runnable) 
@Override 
public void run(){ 
    while(true) { 
     ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
     List<ActivityManager.RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses(); 

     for (int i = 0; i < procInfos.size(); i++) { 
      //check if package installer runs in foreground 
      if (procInfos.get(i).processName.equals("com.android.packageinstaller") && procInfos.get(i).importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 

       //start activity 
       startActivity(new Intent(MasterService.this, OverlayActivity.class).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY)); 
      } 
     } 
    } 
} 

在您的活動,創建任何視圖,並覆蓋後退按鈕,以防止用戶從又回到了包卸載屏幕:

//OverlayActivity.java 
public class OverlayActivity extends Activity{ 

    private ImageView view; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     view = new ImageView(this); 
     setContentView(view); 
    } 


    @Override 
    public void onBackPressed() { 

    } 
}; 

主頁按鈕並不重要,因爲它會隱藏所有活動,並且如果用戶按任務按鈕選擇包管理器,則OverlayActivity將再次打開。 確保主服務不能停止或強制關閉。有兩種方法來解決這個問題:在您的onDestroy功能

  1. 發送自定義廣播消息,再次啓動服務。
  2. 通過檢查com.android.settings來禁用設置應用程序。

我希望你知道你做了什麼,因爲用戶應該知道什麼時候卸載應用程序。

相關問題