我们所知道的通常(在实践中任何)防病毒应用程序在卸载之前用于触发简单的对话框,例如:"你要卸载应用程序,你确定吗?" - "是/否".
是的,我知道我可以使用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的卡巴斯基互联网安全 - 这是卸载它的特殊程序,需要输入密码.
无论如何,这意味着有办法拦截卸载程序,以防止卸载或完成一些最终工作.
我曾经在Subversion/SVN下工作,并立即使用称为关键字替换的好功能.只需输入源文件即可:
/*
* $Author: ivanovpv $
* $Rev: 42 $
* $LastChangedDate: 2012-05-25 21:47:42 +0200 (Fri, 25 May 2012) $
*/
Run Code Online (Sandbox Code Playgroud)
每次Subversion都用实际的关键字替换关键字(Author,Rev,LastChangedDate).
前段时间我被迫转移到Git,只是想知道是否有类似Subversion在Git中的关键字替换?
我有ListView自定义Adapter,View以ListView这种方式供应:
public View getView(int position, View convertView, ViewGroup parent)
{
RelativeLayout.LayoutParams lineParams;
RelativeLayout line=new RelativeLayout(context);
TextView tv=new TextView(context);
tv.setText("Text in postion="+i);
lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lineParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
line.addView(tv, lineParams);
lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
//checkbox
CheckBox checkBox=new CheckBox(context);
lineParams=new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
lineParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
lineParams.addRule(RelativeLayout.CENTER_IN_PARENT);
line.addView(checkBox, lineParams);
return line;
}
Run Code Online (Sandbox Code Playgroud)
在ListView里面的某个地方setOnItemClickListener(),它应该拦截项目点击事件.我的问题是,每当我尝试向项目添加复选框时 - 我都没有得到任何回复ListView.如果我跳过CheckBox或其他任何Button工作.
我真的遇到了这个问题,我尝试了各种布局,对齐,包装等等 - 没用.看起来像CheckBox干扰ListView项目点击事件.
任何想法如何克服?
我正在我的应用程序中创建一堆程序化View的.因为看起来它们默认都是一样的id=-1.为了使用它们,我需要生成唯一的id.
我已经尝试了几种方法 - 随机数生成和基于当前时间,但无论如何没有100%保证不同的视图将具有不同的ID
只是想知道是否有更可靠的方法来生成独特的方法?可能有特殊的方法/类?
我正在测试Cyanogen MOD ROM的几个修改.在真实设备上测试它们并不是很舒服.所以问题是:是否可以在标准(或非标准)Android模拟器上安装自定义ROM(特别是CyanogenMod)?
就在几周前,谷歌改变了Android LVL API(许可证验证库).
在旧的LVL中,许可证检查基于使用基于每个帐户基础生成的公钥/私钥的许可证验证.新的假设每个应用程序库使用公钥/私钥.
我有使用旧LVL的应用程序,看起来它的工作原理(看起来像,但实际上我不知道).应用程序嵌入在每个帐户基础上生成的公钥.
现在,当我决定升级我的应用程序时,我应该怎么做?嵌入公钥用于申请还是仍然使用公钥作为帐户?
我没有在Google的Android开发者网站上找到任何线索......
最新的三星智能手机有一个有趣的功能称为全屏(或在营销术语无限显示).在这种模式下,应用程序还覆盖了主页/后退按钮所在的显示部分.通常的应用程序不会覆盖此区域,使其变黑.但三星的本土产品涵盖了这一领域.
问题:如何实现这种效果?我的意思是我应该使用什么样的清单声明或程序化调用(可能是三星的遗留API)?
我正在尝试通过PendingIntent一些额外的数据发送,例如:
MyMessage message;
//...
Intent intent;
SmsManager sms = SmsManager.getDefault();
intent = new Intent(Constants.SENT_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId()); //putting long id (not -1L)
PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
intent = new Intent(Constants.DELIVERED_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId());
PendingIntent deliveredPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
sms.sendTextMessage(phoneNumber, null, message.getBody(), sentPI, deliveredPI);
Run Code Online (Sandbox Code Playgroud)
然后在Broadcast尝试捕获数据:
@Override
public void onReceive(Context context, Intent intent) {
String message, prefix = "";
String action = intent.getAction();
long id = intent.getLongExtra(Constants.EXTRA_RAW_ID, -1L); //here I receive id=-1
// blah-blah....
} …Run Code Online (Sandbox Code Playgroud) android broadcastreceiver android-intent android-pendingintent
在 Android Q 中引入了新的Scoped 存储功能,它说:
默认情况下,面向 Android 10(API 级别 29)及更高版本的应用会获得对外部存储或范围存储的范围访问。此类应用程序只能访问外部存储上的应用程序特定目录,以及应用程序创建的特定类型的媒体。
我有我的应用程序,它在外部存储上创建 SQLite 数据库,这样当应用程序卸载数据库时,数据库仍然存在,以后可以用作恢复或在 Android 设备之外使用(假设在 PC 中)
我应该如何实现与 Android Q 相同的效果?更准确地说,如果数据库存储在外部公共目录中 - 如何使用标准读取此数据库SQLiteOpenHelper?
我在Git中有一个用Eclipse开发的项目,我需要创建一个Production ready .apk和一个Dev .apk来安装在同一个设备上.
两者之间的变化是次要的属性设置,例如XML提要等.
无论有没有Eclipse,创建要在同一设备上安装的Producion和Deve .apk文件的最佳做法是什么?