我们所知道的通常(在实践中任何)防病毒应用程序在卸载之前用于触发简单的对话框,例如:"你要卸载应用程序,你确定吗?" - "是/否".
是的,我知道我可以使用intent-filter拦截包删除意图,例如:
<activity
android:name=".UninstallIntentActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DELETE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="package" />
</intent-filter>
</activity>
Run Code Online (Sandbox Code Playgroud)
但问题很简单,这会拦截任何删除请求,而且这会触发我的应用程序和库存安装程序之间的选择器对话框.因此,如果用户将选择库存安装程序 - 我将无法做任何事情.
我的目标不是阻止用户卸载我的应用程序,而只是回滚我的应用程序所做的更改.
从这些防病毒应用程序中学习我发现这种操作是可行的,所以请帮助我并解释它是如何可能的?
更新
由于有些人不相信它是真的 - 我会参考Avast移动安全:
Anti-Theft通过各种自我保护技术伪装其组件来保护自己免于卸载.
另一个例子:适用于Android的卡巴斯基互联网安全 - 这是卸载它的特殊程序,需要输入密码.
无论如何,这意味着有办法拦截卸载程序,以防止卸载或完成一些最终工作.
我虽然不可能,但我注意到NQ Mobile Security能够在我点击卸载之后和调用PackageUninstaller之前显示一条消息.我想在我的应用程序中复制此行为.
我试着用一个Activity监听"android.intent.action.DELETE"意图,如下所示: 如何知道我的应用程序是从设备中卸载的?
但是当我即将卸载我的应用程序时,选择器弹出要求选择我的应用程序或程序包卸载程序.我怎么能避免这个?
是否有不同的方法拦截您的应用程序UNINSTALL事件?(在回答不可能之前,请尝试卸载NQ移动安全,看看会发生什么.在我的Android 2.3.4上,它显示了一个很好的屏幕,说没有安全应用程序是不安全的).
当我的Android应用程序被删除时,我还想删除应用程序在SD卡上创建的文件,因为这些文件可能消耗许多兆字节,并且仅用于我的应用程序.
似乎接收PACKAGE REMOVED意图将是这样做的地方.但是,我的广播接收器从未被调用 - 它似乎在发送PACKAGE REMOVED意图之前被删除了
代码是:
public class UninstallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action= intent.getAction();
Log.i("U", "ACTION " + action);
etc.
}
}
并且,在清单中:
<application android:debuggable="true"
android:icon="@drawable/icon"
android:label="@string/app_name">
<receiver android:name ="com.boom.UninstallReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED"/>
<data android:scheme="package" />
</intent-filter>
</receiver>
我正在制作一个应用程序,我正在使用Android Room Persistence Library来处理我的数据库层.房间图书馆就像魅力一样,一切都很好.但我希望在用户卸载应用程序时删除会创建的数据库.我尝试卸载应用程序,然后再次安装,但不知何故数据库仍然存在,应用程序能够从中获取旧数据.
我想也许是因为我的应用程序数据备份在设置中设置为自动,并且android在云上备份并再次将其恢复,但关闭备份设置并没有帮助.即使这样做对你来说听起来不是一个好的解决方案.
我创建了一个非常简单的类,RoomDatabase如果有助于回答问题,则扩展和下面是代码.
我知道我可以fallbackToDestructiveMigration()在数据库构建器上使用并增加数据库版本.它将清除数据库中的数据.那不是我想要的.
@Database(entities = {UnleashedEntity.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
private static AppDatabase INSTANCE;
public abstract DaoContract MyDao();
public static AppDatabase getAppDatabase(Context context) {
if (INSTANCE == null) {
INSTANCE =
Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "user-database")
.build();
}
return INSTANCE;
}
public static void destroyInstance() {
INSTANCE = null;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
我知道我可以使用ACTION_PACKAGE_REMOVED意图让我的应用程序知道卸载.我想知道的是,是否有配置databasebuilder可以完成工作,以及数据库在卸载后如何保留.
我在许多设备上安装了一个应用程序.
如果从任何设备上卸载应用程序,我需要一个指示.
如何实现这一目标.
提前致谢...!
我正在开发Android服务。服务停止时,onDestroy将按预期方式调用。但是,当我在服务运行时卸载应用程序时,onDestroy不会调用,因此应用程序没有机会自行清理。
这正常吗?卸载应用程序后,如何执行服务的关机/清理逻辑?
我正在创建一个应用程序,其目录是在sdcard上创建的 ("/mnt/sdcard/testzapp")
我想在用户时uninstall application也删除该目录.
我怎样才能做到这一点?
如何在先前在其设备上安装应用程序的用户卸载应用程序之前启动活动、服务或广播接收器?
如果可能,请帮助我?并提前致谢