在Android中禁用应用程序unistall?

时间:2012-04-20 06:34:41

标签: android

我想要这样的东西,当我的应用程序将安装在Android手机。没有机构可以从手机上卸载它,或者任何人试图卸载它,弹出显示或任何警报。 有什么办法吗?

4 个答案:

答案 0 :(得分:7)

您需要启用deviceAdmin才能停用Force StopUninstall功能。这由处理企业/应用程序策略管理的Device Admin API处理。

答案 1 :(得分: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(在非root用户手机上)运行程序包管理器以卸载应用程序。 在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将再次打开。 确保无法停止或强制关闭主服务。有两种方法可以解决这个问题:

  1. onDestroy功能中发送自定义广播消息,再次启动您的服务。
  2. 检查com.android.settings
  3. ,也可以停用设置应用

    我希望你知道你做了什么,因为用户应该知道何时卸载应用程序。

答案 2 :(得分:1)

理论上,您可以“根”手机,将您的应用程序添加到系统分区(用户无法修改系统分区),然后再次“取消root”手机。不过,我不确定这适用于所有型号。有些设备不能“不扎根”。

答案 3 :(得分:0)

我目前认为你可以实现这一目标的唯一方法是使用两个应用程序。

  1. 是主人..它作为服务运行,检查是否安装了应用程序,如果缺少则安装它。
  2. 是您希望用户看到的应用
  3. 好吧..好吧,我可以想到其他方法......正如Blessenm所说,改变操作系统..但是假设你的目标是特定的硬件。

    您可能能够将系统置为根,这可以让您访问管理员的想法。不确定它是否可行。