保存Android应用程序的应用程序类(单例)中存储的数据的最佳方法是什么?
我有一个安静的大应用程序,在活动之间共享大量数据.因此大部分都存储在Application Singleton上.
这一切都很有效.. util应用程序被内存不足的操作系统杀死...然后当它返回时,它会尝试恢复活动而没有成功,因为缺少必须在Application上的数据.
由于缺乏一种非常欣赏(和需要)的方法来根据您的经验在应用程序上保存数据,哪种方法最好?
我可以保存一些东西,除了"正常"字符串,布尔值等,比如Bitmaps?
我已经看到了如何在Android中声明全局变量?但问题并不是关注在这种情况下重要的是什么,如何在应用程序因内存不足而被杀死时保存数据......
我在内部/外部存储中读过这个Android保存应用程序设置/数据,但我不认为我真的得到了答案.
我正在开发一个应用程序,我应该存储一些"缓存"数据,如十几个图像和一些字符串(json).
最初我将所有这些存储在SD卡上(外部存储)但后来我认为这可能会被SDCard弃用在最近的设备中弃用.
读了一下之后,我明白外部存储不仅仅是SD卡,而是"可移动存储介质(如SD卡)或内部(不可移动)存储",所以不应该弃用但是......它是共享的空间,并没有存储在那里的文件的所有权,所以第一个问题是我删除应用程序时无法删除它们.
所以我改为内部存储,以避免文件/图像"公开",并在删除应用程序后删除它们.
这是推荐的方法吗?
对于内存较低但SD卡空间较大的设备,这是一种很好的方法吗?
我的应用程序支持从1.6到4.0(到目前为止)所以我有很多遗留设备......我必须让应用程序正常工作(好).
期待一些有趣的答案!
是否可以在android中以编程方式将活动发送到后台?
我正在创建一个恶作剧应用程序,在指定时间后播放有趣的声音(由用户输入).并且我不希望应用程序在播放该声音时可见,并且显示器应该是黑暗的.
我正在尝试在Android上同时进行多次翻译.
我在布局上有两个或更多按钮(大小相同),当我按下一个按钮时,我希望其他按钮移出屏幕.
我已经完成了一个测试应用程序来尝试实现此行为.
在它上面我点击一个按钮设置一个监听器进行测试,例如:
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
Button toMove = (Button) findViewById(R.id.button_test2);
Button toMove2 = (Button) findViewById(R.id.button_test3);
AnimationSet set = new AnimationSet(true);
TranslateAnimation anim = new TranslateAnimation(0, -toMove
.getWidth(), 0, 0);
anim.setFillAfter(true);
anim.setDuration(1000);
toMove.setAnimation(anim);
toMove2.setAnimation(anim);
set.addAnimation(anim);
set.startNow();
}
Run Code Online (Sandbox Code Playgroud)
风景:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button android:id="@+id/button_test" android:layout_width="200px"
android:layout_height="50px" android:text="@string/hello" />
<Button android:id="@+id/button_test2" android:layout_width="200px"
android:layout_height="50px" android:text="@string/hello"/>
<Button android:id="@+id/button_test3" android:layout_width="200px"
android:layout_height="50px" android:text="@string/hello"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
问题是两个按钮开始动画,一个接着一个接一个.我读过它是由于getDelayForView()返回每个的不同延迟.有没有办法同时移动2个或更多按钮?
谷歌不是很有帮助: -
我有一个非常无聊的问题.当我的应用程序转到后台时,有时会在LogCat显示时终止该进程:
INFO/ActivityManager(187): Low Memory: No more background processes.
INFO/ActivityManager(187): Process com.app.myapp (pid 20681) has died.
INFO/WindowManager(187): WIN DEATH: Window{40592708 com.app.myapp/app.myapp.dashboard.Dashboard paused=false}
ERROR/InputDispatcher(187): channel '408b1d40 app.myapp/app.myapp.menus.products.Promotions (server)' ~ Consumer closed input channel or an error occurred. events=0x8
ERROR/InputDispatcher(187): channel '408b1d40 app.myapp/app.myapp.menus.products.Promotions (server)' ~ Channel is unrecoverably broken and will be disposed!
INFO/WindowManager(187): WIN DEATH: Window{408b1d40 app.myapp/app.myapp.menus.products.Promotions paused=false}
INFO/ActivityManager(187): Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10100000 cmp=app.myapp/.Main } from pid 187
INFO/ActivityManager(187): Start proc app.myapp for activity app.myapp/.menus.products.Promotions: pid=20721 uid=10062 gids={3003, 1015}
Run Code Online (Sandbox Code Playgroud)
当我尝试返回应用程序时,通过任务切换器(长按回家),它会尝试返回上次打开的活动...并崩溃. …
我有一个项目,我有两个挑战:
第一:
为此,我发现的最佳方法是.layout()在视图上使用方法.
第二:
有没有更好的方法在Android上移动视图?
使用该方法可能有什么缺点.layout()?
public void layout (int l, int t, int r, int b)
Since: API Level 1
Assign a size and position to a view and all of its descendants
Parameters:
l Left position, relative to parent
t Top position, relative to parent
r Right position, relative to parent
b Bottom position, relative to parent
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我有一个Service列出联系人更改的实例:
Application.getContentResolver().registerContentObserver(ContactsContract.Contacts.CONTENT_URI, true, mContactsObserver);
Run Code Online (Sandbox Code Playgroud)
这是在onStartCommand和未注册的onDestroy
它Service与生活在Application实例上的Manager通信.
考虑到这个设置,我有一个奇怪的错误:
我打开应用程序一切正常
我将应用程序发送到后台并将其删除,服务重新启动,一切正常
但是当我将应用程序发送到后台时,有时日志会停止,应用程序似乎冻结...我没有收到任何联系人更改通知,也没有收到任何其他内容,但应用程序也没有被杀死.我有一个ScheduleThreadPool不会触发其在此期间的任务.
每当我再次打开应用程序时,所有恢复都正常.并且日志显示服务未重新创建它仍在运行.
由于某些电池节电政策,这是预期的行为吗?
Importante note:这是在搭载Android 4.4.2的三星GT-I9515上发生的,因此Doze不是罪魁祸首.
我目前正在使用一个使用大量反射的 Android 库。
一旦我启用 proguard 并运行它......它就会崩溃。
为什么?它使用了大量的反射,并且方法仅通过反射调用,因此它们被proguard检测为未使用并在收缩过程中删除,因此NoSuchMethodError抛出aa 。
为什么会发生这种情况?这很容易弄清楚它们在收缩过程中被删除了,因为 proguard 认为它们是未使用的,因此删除了这些代码片段(所有方法)
那么,如何配置 proguard 以避免缩小或混淆整个包?(图书馆)
注意:我不想使用 -dontshrink 选项,因为它要么全有要么全无,我只想避免使用特定的包。
更多信息:
运行时错误如下:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.my.app.debug, PID: 3771
java.lang.NoSuchMethodError: observeValueForKeyPath [class java.lang.String, class java.lang.Object, class com.my.lib.util.Dictionary, class java.lang.Object]
at com.my.lib.util.Observable$ObservationManager$Observer.<init>(SourceFile:47)
at com.my.lib.util.Observable$ObservationManager$Observer.<init>(SourceFile:26)
at com.my.lib.util.Observable$ObservationManager.addObserver(SourceFile:159)
...
Run Code Online (Sandbox Code Playgroud)
请注意,问题是一个内部内部类......
我目前的配置是这样的:
-keep,includedescriptorclasses class com.my.** { *; }
-keepclassmembers class com.my.lib** { *; }
-keep,includedescriptorclasses class com.my.lib.util.Observable$* { *; }
-keep,includedescriptorclasses class com.my.lib.util.Observable$*$* { *; }
Run Code Online (Sandbox Code Playgroud)
但这显然只能避免混淆在收缩过程中未删除的方法......我需要避免在收缩过程中删除方法。
为什么要Android维护 2 个似乎支持相同事物的不同 Log 类?
我说的是:
Log android.util.LogLogger java.util.logging.Logger对于我多年来所看到的开发,每个 Android 官方文档都指向LogLogger 而不是 Logger。
甚至像TimingLogger这样的特定记录器也使用Log.
那么为什么支持这两个呢?
是否有任何功能可以通过Logger我无法实现Log?
两者都有特定的用例吗?
我想我刚刚发现了一个非常奇怪的错误......但这可能只是我从未听说过的某种功能。
在我的应用程序中,当您尝试使用以下代码将堆栈“清理”到某个点时,如果 AndroidManifest 上有任何带有 android:launchMode="singleInstance" 的 Activity:
Intent intent = new Intent(this, Xpto.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
它转到该活动。但是当你按回车键时,它又回到了之前的状态。本来应该已经完成了......
例子:
A -> B -> C
然后从 CI 中使用 Intent.FLAG_ACTIVITY_SINGLE_TOP| 调用 A Intent.FLAG_ACTIVITY_CLEAR_TOP 在清单上有一个 singleInstance。它转到 A,但仅将其带到前面。并且没有完成C和B。
有人可以解释这种行为吗?
我调用的 Xpto 类当时是堆栈的根活动。