如果进程在后台并且操作系统决定它需要资源(RAM,CPU等),Android将终止进程.我需要能够在测试期间模拟这种行为,以便我可以确保我的应用程序正常运行.我希望能够以自动方式执行此操作,以便我可以测试应用程序在发生这种情况时是否正常运行,这意味着我必须在每个活动中对此进行测试等.
我知道如何杀死我的进程.那不是问题.问题是,当我杀死我的过程(使用DDMS, ,adb shell kill
,Process.killProcess()
等)的Android不重新启动它以同样的方式,它将如果Android操作系统杀死了它本身.
如果Android操作系统终止进程(由于资源要求),当用户返回应用程序时,Android将重新创建该进程,然后在活动堆栈上重新创建顶级活动(调用onCreate()
).
另一方面,如果我终止进程,Android会假定活动堆栈顶部的活动表现不佳,因此它会自动重新创建进程,然后从活动堆栈中删除顶级活动并重新创建下面的活动顶级活动(调用onCreate()`).这不是我想要的行为.我想要与Android杀死进程时相同的行为.
只是用图解来解释,如果我的活动堆栈看起来像这样:
ActivityA -> ActivityB -> ActivityC -> ActivityD
Run Code Online (Sandbox Code Playgroud)
如果Android终止进程并且用户返回应用程序,Android将重新创建该进程并创建ActivityD.
如果我终止该过程,Android将重新创建该过程并创建ActivityC.
我花了整整4天时间尽我所能来弄清楚我正在开发的应用程序中的内存泄漏,但事情很久以前就停止了.
我正在开发的应用程序具有社交性,因此请考虑配置文件活动(P)并列出包含数据的活动 - 例如徽章(B).您可以从配置文件跳转到徽章列表,转到其他配置文件,其他列表等.
所以想象一下这样的流程P1 - > B1 - > P2 - > B2 - > P3 - > B3等.为了保持一致性,我正在加载同一个用户的配置文件和徽章,所以每个P页面是相同的,所以是每个B页面.
这个问题的一般要点是:在导航了一下之后,根据每个页面的大小,我在随机位置得到了一个内存不足的例外 - 位图,字符串等 - 它似乎并不一致.
在做了一切可以想象的事情来弄清楚为什么我的内存不足之后,我什么也没想出来.我不明白的是,如果Android在加载时耗尽内存而不是崩溃,那么为什么Android不会杀死P1,B1等.如果我通过onCreate()和onRestoreInstanceState()返回它们,我会期望这些早期活动会死亡并复活.
更别说这个 - 即使我做P1 - > B1 - >返回 - > B1 - >返回 - > B1,我仍然会崩溃.这表明某种内存泄漏,即使在转储hprof并使用MAT和JProfiler后,我也无法查明它.
我已禁用从Web加载图像(并增加了加载的测试数据以弥补它并使测试公平)并确保图像缓存使用SoftReferences.Android实际上试图释放它所拥有的一些SoftReferences,但就在它崩溃内存之前.
徽章页面从Web获取数据,从BaseAdapter将其加载到EntityData数组中并将其提供给ListView(我实际上使用的是CommonsWare的优秀MergeAdapter,但在此Badge活动中,实际上只有1个适配器,但我无论哪种方式都想提到这个事实).
我已经完成了代码并且无法找到任何可能泄漏的内容.我清除并取消了我能找到的所有内容,甚至是System.gc()左右,但应用程序崩溃了.
我仍然不明白为什么堆栈上的非活动活动不会被收获,我真的很想知道这一点.
在这一点上,我正在寻找任何提示,建议,解决方案......任何有用的东西.
谢谢.
isFinishing()
在http://developer.android.com/reference/android/app/Activity.html上阅读Android文档后,我感到困惑
如果我打电话isFinishing()
的onPause()
,返回值是什么isFinishing()
呼,应在以下3个方案是什么?
我确信在方案1中结果finish()
将是真的,在方案3 中将是错误的.
情景2怎么样?在方案2中会isFinishing()
返回true还是false?
当应用程序的进程被终止时,将保存其活动堆栈.然后,当重新启动应用程序时,我的所有活动都会恢复并运行为空指针.我宁愿让我的应用程序从基本活动开始,而不是尝试重新创建活动堆栈,而不是修改每个活动以适应此事件.
这可能吗?
我知道Intent.FLAG_ACTIVITY_CLEAR_TOP,但据我所知,只会在重新创建后杀死活动.
编辑:是clearTaskOnLaunch我想要什么?我已将其添加到我的默认活动中,但看不到任何效果.但即使我只是最小化应用程序,这也会扼杀我的活动,不是吗?如果整个过程重启,我宁愿只清除堆栈.
编辑2:不,这不是我想要的 - 一位Android工程师对如何使用ClearTaskOnLaunch的一些问题做出了彻底的回应:http://groups.google.com/group/android-developers/browse_thread/thread/da024bcaf4e1960f/ab1e2b35c360cb65 ?PLI = 1
我想完成()一个透明活动下面的暂停活动.
我有一项活动,称为活动A.当活动A处于活动状态时,可能会发生两件事;
我们可以启动(透明)活动B.
我们可以接收异步回调来完成活动A.
这两个动作彼此非常接近.代码看起来像这样
public class ActivityA extends Activity
{
public class DataHandler implements ContentLoader.OnDataListener
{
@Override
public void onData(Cursor data)
{
_binder.bind(data);
}
}
//If this callback is executed while Activity A is paused, it will not go into onStop until it the activity above it is finished
private class LoaderCallbacks extends ContentLoader.LoaderCallbacks
{
public LoaderCallbacks(ContentLoader loader)
{
super(loader);
}
@Override
public void onLoadFinished(
Loader<Cursor> loader,
Cursor cursor)
{
if (cursor == null || cursor.getCount() <= 0)
{ …
Run Code Online (Sandbox Code Playgroud) 任何人都可以确认以下关于Android应用程序生命周期?
1)当应用程序在前台时,内存将包含Application对象的实例,所有活动的实例(未被杀死)以及从其中一个根引用的所有对象引用(尚未被垃圾回收)
2)当应用程序进入后台时,在某些时候Android框架可以:a)杀死给予应用程序目的的整个过程,这将完全删除内存中的所有对象b)仅杀死(所以必须没有其他对象引用将被删除)活动(通过完成它们并且实质上是任何片段)保存它们的状态并创建活动堆栈并留下任何其他东西(应用程序对象,任何其他静态对象,可从任何根目录访问的引用).
我最感兴趣的是2b,但是我会对所有这些点进行确认,因为我试图从头到尾抓住整个概念.
当我的应用程序在任何活动中崩溃时,似乎它试图从backstack重新打开最后一个活动.但是,由于某种原因,最后一个活动无法正常启动并再次崩溃.有时它会发生几次.好像它开始在后台堆放回来并且在那里崩溃了所有的活动.因此,在我回到主屏幕之前,所有我能看到的都是闪烁的"不幸的是你的应用程序停止了"消息.
我总是重写onBackPressed()函数,所以当我在活动之间导航时我称之为:
startActivity(new Intent(this, NextActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
Run Code Online (Sandbox Code Playgroud)
我正在使用曲棍球应用程序来捕获堆栈跟踪,但由于这个问题我无法捕获问题发生的第一次崩溃.
有没有人见过这样的问题?
更新:
当应用程序崩溃时,Android会终止进程......这意味着当顶部的Activity崩溃时我丢失了我的静态变量,因此后台的Activity无法恢复其状态.