小编Bar*_*ica的帖子

应用程序如何检测到它将被卸载?

我们所知道的通常(在实践中任何)防病毒应用程序在卸载之前用于触发简单的对话框,例如:"你要卸载应用程序,你确定吗?" - "是/否".

是的,我知道我可以使用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的卡巴斯基互联网安全 - 这是卸载它的特殊程序,需要输入密码.

无论如何,这意味着有办法拦截卸载程序,以防止卸载或完成一些最终工作.

android uninstall android-intent

70
推荐指数
3
解决办法
6万
查看次数

像Subversion中的Git关键字替换?

我曾经在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中的关键字替换?

svn git version-control version-control-keywords

42
推荐指数
3
解决办法
2万
查看次数

OnItemClickListener不适用于包含按钮的ListView项

我有ListView自定义Adapter,ViewListView这种方式供应:

   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项目点击事件.

任何想法如何克服?

android listview button adapter onitemclicklistener

31
推荐指数
3
解决办法
4万
查看次数

程序化视图如何设置唯一ID?

我正在我的应用程序中创建一堆程序化View的.因为看起来它们默认都是一样的id=-1.为了使用它们,我需要生成唯一的id.

我已经尝试了几种方法 - 随机数生成和基于当前时间,但无论如何没有100%保证不同的视图将具有不同的ID

只是想知道是否有更可靠的方法来生成独特的方法?可能有特殊的方法/类?

android view uniqueidentifier

29
推荐指数
4
解决办法
3万
查看次数

Android模拟器上的CyanogenMod - 有可能吗?

我正在测试Cyanogen MOD ROM的几个修改.在真实设备上测试它们并不是很舒服.所以问题是:是否可以在标准(或非标准)Android模拟器上安装自定义ROM(特别是CyanogenMod)?

android rom android-emulator cyanogenmod

19
推荐指数
1
解决办法
2万
查看次数

Android app许可新旧 - 疑惑

就在几周前,谷歌改变了Android LVL API(许可证验证库).

在旧的LVL中,许可证检查基于使用基于每个帐户基础生成的公钥/私钥的许可证验证.新的假设每个应用程序库使用公钥/私钥.

我有使用旧LVL的应用程序,看起来它的工作原理(看起来像,但实际上我不知道).应用程序嵌入在每个帐户基础上生成的公钥.

现在,当我决定升级我的应用程序时,我应该怎么做?嵌入公钥用于申请还是仍然使用公钥作为帐户?

我没有在Google的Android开发者网站上找到任何线索......

android public-key-encryption android-lvl

19
推荐指数
1
解决办法
909
查看次数

三星Galaxy S8全屏模式

最新的三星智能手机有一个有趣的功能称为全屏(或在营销术语无限显示).在这种模式下,应用程序还覆盖了主页/后退按钮所在的显示部分.通常的应用程序不会覆盖此区域,使其变黑.但三星的本土产品涵盖了这一领域.

问题:如何实现这种效果?我的意思是我应该使用什么样的清单声明或程序化调用(可能是三星的遗留API)?

java android fullscreen display samsung-galaxy

19
推荐指数
1
解决办法
1万
查看次数

如何通过PendingIntent发送数据到广播?

我正在尝试通过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

16
推荐指数
2
解决办法
3万
查看次数

Android Q:范围存储中的 SQLite 数据库

在 Android Q 中引入了新的Scoped 存储功能,它说:

默认情况下,面向 Android 10(API 级别 29)及更高版本的应用会获得对外部存储或范围存储的范围访问。此类应用程序只能访问外部存储上的应用程序特定目录,以及应用程序创建的特定类型的媒体。

我有我的应用程序,它在外部存储上创建 SQLite 数据库,这样当应用程序卸载数据库时,数据库仍然存在,以后可以用作恢复或在 Android 设备之外使用(假设在 PC 中)

我应该如何实现与 Android Q 相同的效果?更准确地说,如果数据库存储在外部公共目录中 - 如何使用标准读取此数据库SQLiteOpenHelper

java sqlite android kotlin android-sqlite

16
推荐指数
1
解决办法
1062
查看次数

如何在同一设备上安装相同的Android App .apk两次?

我在Git中有一个用Eclipse开发的项目,我需要创建一个Production ready .apk和一个Dev .apk来安装在同一个设备上.

两者之间的变化是次要的属性设置,例如XML提要等.

无论有没有Eclipse,创建要在同一设备上安装的Producion和Deve .apk文件的最佳做法是什么?

android production-environment apk

13
推荐指数
1
解决办法
2万
查看次数