我一直被这个"特性"所困扰:当我使用Back按钮离开我的应用程序时,我可以告诉onDestroy()被调用,但是下次我运行我的应用程序时,Activity类的所有静态成员仍然保留它们的值.请参阅以下代码:
public class HelloAndroid extends Activity {
private static int mValue; // a static member here
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText((mValue != 0) ?
("Left-over value = " + mValue) : "This is a new instance");
setContentView(tv);
}
public void onDestroy() {
super.onDestroy();
mValue++;
}
Run Code Online (Sandbox Code Playgroud)
}
上面的代码在mValue中显示剩余值,并在会话结束时递增,这样我就可以确定调用了onDestroy().
我在这个论坛上找到了一个有用的答案,我在上面的代码中理解mValue是一个类成员,而不是实例成员.但是,在这个特殊情况下,我只有一个HelloAndroid活动,所以当他去世时,一切都被清理干净,下次我回来时,一切都重新开始了,这不是真的吗?(或者,在onDestroy()之后,系统中还有其他一些神秘的东西仍然坚持它,这样它就不会死了吗?)
(上面只是一个变量,如果它是一堆对象引用怎么办?每个部分都是一个单独的可重新收集的内存.GC是否有机会收集其中一些而不是全部或者没有?这真的让我烦恼. )
我刚刚发布了一个应用程序,一个付费应用程序,4天后,用户告诉我,中国有另一个网站托管我的应用程序.我从那里下载了它,它在我的设备上运行正常!
这里有帖子说人们可以更改包名并重新发布apk.但这不是我的情况,破解版仍然使用相同的包名.我在程序中使用了Android Vending Licensing,但破解版本根本不进行许可检查.我使用ProGuard对其进行了模糊处理,但这并没有阻止黑客.
问题1:我根据Google的说明签署了apk文件.但是,他们仍然修改了代码并取出了许可检查部分.我错误的是签署一个apk文件旨在防止人们篡改文件内容?
问题2:对于Win32 .exe程序,我曾经使用校验和来确定文件是否已被更改.这是它的工作原理:当创建.exe时,我使用工具计算文件的字节内容之和,然后将其填充到文件中的某个位置,例如,文本模式"MY SIGNATURE"之后的4个字节.然后在运行时,程序打开.exe文件并计算字节总和,将其与签名后的整数进行比较.
有没有人在apk文件上尝试过这种方法?关心分享您的经历?
我使用以下代码将文本设置为AutoCompleteTextView字段.但我注意到,当我将某些文本(不是所有文本,而是一些文本)设置为它时,它会自动弹出下拉列表.如果我不要求焦点,那会更好,但更好,不完全正确.我试过dissmissDropDwon(),它没有帮助.那么,有没有办法在设置文本并关注它后停止显示下拉?
actv.setText("Tim Hortons");
actv.setSelection(0, actv.getText().length());
actv.requestFocus();
actv.dismissDropDown(); // doesn't help
Run Code Online (Sandbox Code Playgroud)
谢谢!
我不熟悉签名文件的想法,到目前为止我找不到满意的答案,所以我想我最好问:
我想知道的是当签署二进制文件(对于Android)时,签名工具是否为文件分配了某种校验和,以便当黑客在apk文件中更改某些内容时,程序将拒绝启动,因为校验和不会不配.Android的签名工具中是否存在此机制?
好吧,我理解当黑客拥有二进制文件时,他可以禁用任何他想要的东西,包括校验和检查.但问题是:Android的签名工具是否首先提供此级别或保护?
感谢您的阅读和回答!
当Android设备插入PC(通过USB?)时,内部文件系统是否映射到PC上的驱动器盘符?那么人们可以在Windows下复制文件到Android吗?
而且,Emulator可以模拟插入时的情况吗?怎么样?
先感谢您!
我的GestureListener类在onSingleTap()或onFling()等方法中接收MotionEvent.有没有办法确定此事件的基础视图?
背景:我有一个包含许多子视图的LinearLayout.此LinearLayout上有一个触摸侦听器,可以调用手势检测器.因此,当用户在任何子视图上执行手势时,LinearLayout的手势检测器将接收MotionEvent.但问题是,因为有很多孩子,我需要确切地知道用户使用了哪个孩子.但我找不到将坐标转换为视图的方法.有没有办法做到这一点?
一个丑陋的解决方案:动态添加孩子.因此,我可以将所有子项保留在列表中,然后当MotionEvent出现时,我可以遍历列表并查看该点是否在子项中.但我不喜欢这个想法.有没有更好的办法?
我在这里看到了一些相关的问题和答案,但它们似乎没有帮助.所以我想我需要在这里发一个单独的问题:
我有一个可序列化的类MyDataClass,它包含一些可序列化的内部类.我使用FileOutputStream和将其保存到文件中ObjectOutputStream.在阅读它时,我有时会得到一个例外(可能ClassNotFoundException或者InvalidClassException我不确定),并且异常的消息是这样的:
12-01 18:44:16.479: D/My App Name(534): ***** exception occurred
com.xyz.myapp.lib.am; Incompatible class (SUID): com.xyz.myapp.lib.am:
static final long serialVersionUID =3894560643019408205L; but expected
com.xyz.myapp.lib.am: static final long serialVersionUID =-4215454881436014736L;
Run Code Online (Sandbox Code Playgroud)
MyDataClass 是这样的:
public static class MyDataClass implements Serializable {
private static final long serialVersionUID = 0x98F22BF5;
.....
public boolean bNoTitle;
public short syncOption;
.....
public class InnerClass implements Serializable {
private static final long serialVersionUID = 0x99D32720;
double premium;
double interest;
} …Run Code Online (Sandbox Code Playgroud) 安装程序
我有一个只覆盖onCreate(),onResume()和onSaveInstanceState()的活动.在onSaveInstanceState()中,我放入了一个可序列化的对象:
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putSerializable("obj", myObj); // myObj is of class MyClass state.putLong("long", longVar);
}
Run Code Online (Sandbox Code Playgroud)
MyClass最初是activity类中的内部类,但是对于调试,我甚至将它移动到一个单独的文件中:
public class MyClass implements Serializable {
private static final long serialVersionUID = 0x98ED2F00;
....
}
Run Code Online (Sandbox Code Playgroud)
步骤:
从Launcher再次启动程序,这次我得到以下内容:
java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.Reports}:java.lang.RuntimeException Parcelable遇到ClassNotFoundException读取可序列化对象{name = com.example.MyClass}
引起:java.lang.ClassNotFoundException:加载器dalvik.System.PathClassLoader [.]中的com.examp.MyClass
线索和观察:
最重要的线索是:如果我没有在onSaveInstanceState()中保存myObj,那么一切都很好.并且,将任何原始类型放入Bundle中都很好,但不是我的对象.
异常抛出我的代码之外,它发生在onCreate()和onResume()之间.它发生在Android内部.
错误消息中的类名是正确的:com.example.MyClass.最初它是活动内部的一个内部类,但是为了隔离问题,我把它移到一个单独的文件中,但无济于事.
我相信Serializable的实现是正确的,因为它可以序列化到程序的其他部分的文件中.
有没有人知道这可能的原因?非常感激!(对不起,我不能在这里放置详细的代码,因为一切都在这里和那里交织在一起.我只能尽可能地隔离.)
作为标题,如何删除 AutoCompleteTextView 使用的 ArrayAdapter 上的过滤以获取原始列表?
多一点背景:
这一切都始于一个可悲的事实,即传递给 onItemClick() 的“位置”值是无用的。“位置”是指数组被过滤后的位置,但我需要知道它的真实位置。所以,我想要做的是当我获得所选项目的文本时(通过使用 getItemAtPosition(position)),我将它与支持 ArrayAdapter 的原始字符串数组一一比较。但是,我发现在调用 onItemClick() 时,适配器已经被过滤了,我无法再访问原始数组。所以我想如果我可以删除过滤器,也许我可以找回原始数组并在其中查找所选项目。
ArrayAdapter<String> mAdapter;
public void onCreate() {
// Create an adapter and remembere it as a class member.
mAdapter = new ArrayAdapter<String>(this, layoutId);
// Add 100 strings to it and attach it to an AutoCompleteTextView
for (int i = 0; i < 100; i++)
mAdapter.add("random text");
((AutoCompleteTextView)findViewById(id)).setAdapter(mAdapter);
}
@Override
public void onItemClick(AdapterView<?> actv, View view, int position, long id) {
if (actv.getAdapter().equals(mAdapter))
Log.d("The adapter contained in actv …Run Code Online (Sandbox Code Playgroud) 我刚刚完成了我的应用程序首次代码签名,感谢Jeff Wilcox博客的帮助,他的分步说明,我能够在不到36小时内完成整个过程.但现在我开始想知道为什么我花了这笔钱,因为我无法看到它如何帮助软件发行商:
有黑客试图通过逆向工程和修改代码来打破程序中的保护机制.但是签名文件并不能防止这种情况发生,他们仍然可以随意修改文件的内容.
有时一些反病毒程序可能会错误地认为我的.exe文件包含病毒.对文件进行签名也无济于事.
代码签名只能告诉用户这个文件来自我,但他们仍然不知道我是好人还是坏人.所以它对用户也没有帮助.
我的结论是代码签名不是为了帮助软件发行商或用户.它只试图跟踪文件来自何处,如果它包含病毒,人们就知道是谁种植了它,就是这样!(只有当黑客无法将病毒捎带到签名的.exe文件中时才会这样.)
我的问题是:我的理解是否正确?还是我错过了什么?谢谢.