我希望有这样一种功能,当我的应用程序安装在安卓手机上时,任何人都不能从手机上卸载它,或者当有人尝试卸载它时,会弹出一个提示框或警报。
有没有办法实现这个功能?
我希望有这样一种功能,当我的应用程序安装在安卓手机上时,任何人都不能从手机上卸载它,或者当有人尝试卸载它时,会弹出一个提示框或警报。
有没有办法实现这个功能?
您需要启用设备管理器才能禁用强制停止
和卸载
功能。这由设备管理器API
处理,该API处理企业/应用程序策略管理。
//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));
来启动它,并在清单文件中将其声明为已导出和已启用。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
函数中发送自定义广播消息,以再次启动您的服务。com.android.settings
来禁用设置应用程序。我希望您知道自己在做什么,因为用户应该知道何时卸载应用程序。
我目前唯一认为你可以实现这个的方法是使用两个应用程序。
好吧...我可以想到其他方法...就像Blessenm所说的那样,修改操作系统...但这假设您正在针对特定的硬件。
您可能能够Root系统,这可能会给您访问管理员权限的机会...不确定它是否有效。