Articles of android activity

如何在Android中调用多个WebView时控制内存使用情况?

我的应用程序的主要活动是一个Activity ,其中包含一个Web Webview来加载网页。 我重写方法shouldOverrideUrlLoading(WebView view, String url) ,使每个URL请求调用一个Intent并加载在一个新的同一活动,包含WebView 。 这样做是为了在按下BACK键时提供更好的体验,只需完成当前的活动并返回到前一个活动,与单一webview中使用goBack()相比,无需再次渲染页面。 但是现在的问题是,在我打开很多url后,在后台创build一个长长的活动队列,它使用的内存变大了。 当我回到启动器并检查进度时,我可以看到我的应用程序caching了超过200M的数据。 这是不可接受的… 有趣的是,我可以看到我的应用程序用完了我的内存,但在Eclipse的DDMS的Heap视图中,我可以看到应用程序分配的内存不超过10M。 所以我猜200M是Webviewcaching的webStorage ? 有什么办法来控制内存? 我正在考虑一次只保存5层活动,回去5次时只是跳回主页。 但是还是不知道如何在我需要的5个活动旁边释放内存,这个我再也不用了? 或者,如果这是因为WebView自动保存网页caching,如何手动pipe理这个? 如设置最大caching大小或页数的限制?

Google +login:活动无法启动

我在我的项目中使用com.actionbarsherlock.app.SherlockActivity。 当我尝试开始另一个活动,我需要进行Google+login时,会发生此错误。 我得到这个错误在一个实际的设备,而不是模拟器。 你觉得我做错了什么? 错误 05-12 15:58:12.487: E/AndroidRuntime(24310): FATAL EXCEPTION: main 05-12 15:58:12.487: E/AndroidRuntime(24310): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.google.android.gms/com.google.android.gms.plus.activity.AccountSignUpActivity}: java.lang.SecurityException: Must be started via startActivityForResult 05-12 15:58:12.487: E/AndroidRuntime(24310): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 05-12 15:58:12.487: E/AndroidRuntime(24310): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 05-12 15:58:12.487: E/AndroidRuntime(24310): at android.app.ActivityThread.access$600(ActivityThread.java:141) 05-12 15:58:12.487: E/AndroidRuntime(24310): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 05-12 15:58:12.487: E/AndroidRuntime(24310): at android.os.Handler.dispatchMessage(Handler.java:99) 05-12 15:58:12.487: E/AndroidRuntime(24310): at […]

Android睡眠后的活动生命周期

如果一个活动正在屏幕上显示,并且有一个点击监听器的button,在onCreate方法期间,该button被附加到button,然后设备进入睡眠模式(或者用户点击电源buttonclosures屏幕),当屏幕返回时,活动仍然可见,因为它是在进入睡眠模式之前。 onResume被调用,这被logging为活动生命周期的一部分。 我不明白的是为什么onCreate不会再被调用。 在睡眠模式退出后,button的点击监听程序如何工作? 你可能会认为Android已经销毁了所有正在运行的进程,这些进程连接到包含button的点击监听器的活动。

如何从中心开始新的活动作为一个扩展的圈子

我想从屏幕中心开始一个新的活动作为一个扩展的圈子,所以这个活动会像这样一个圆圈显示出来。 这是我目前的代码anim.xml <set xmlns:android="http://schemas.android.com/apk/res/android" > <scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="200" android:fromXScale="0" android:fromYScale="0" android:pivotX="50%" android:pivotY="50%" android:toXScale="1" android:toYScale="1" > </scale> animback.xml <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale xmlns:android="http://schemas.android.com/apk/res/android" android:duration="1000" android:fromXScale="1.0" android:fromYScale="1.0" android:pivotX="50%" android:pivotY="50%" android:toXScale="1.0" android:toYScale="1.0" > </scale> </set> 调用animation overridePendingTransition(R.anim.anim,R.anim.animback); 目前的代码只是放大新的活动,但我希望从中心作为一个圆圈显示的活动。

当进入多窗口模式时,奇怪的生命周期callbacksorting

我遇到了RxJava,Retrofit和Multi-Window模式的问题…我在一个Activity中调用了我们自己的api(Retrofit)(实际的代码比这个更复杂一些): api.getEvent(…) .subscribeOn(Schedulers.io()) .observeOn(AndroidScheduler.mainThread()) .subscribe(event -> setupUI(event), throwable -> showSnackbar(throwable)); 当应用程序处于“正常”模式(全屏)时,一切运行良好…我可以把应用程序放在bg中,放到前台,并再次调用API调用方法(它位于onResume方法 – 类的),用户界面绘制没有问题。 当我激活多窗口模式,相反,调用onResume,api方法调用成功,但subscribe()方法永远不会到达。 这种情况的堆栈跟踪是: Retrofit: java.io.InterruptedIOException: thread interrupted at okio.Timeout.throwIfReached(Timeout.java:145) at okio.Okio$1.write(Okio.java:77) at okio.RealBufferedSink.flush(RealBufferedSink.java:221) at com.squareup.okhttp.internal.framed.Http2$Writer.flush(Http2.java:381) at com.squareup.okhttp.internal.framed.FramedConnection.newStream(FramedConnection.java:283) at com.squareup.okhttp.internal.framed.FramedConnection.newStream(FramedConnection.java:249) at com.squareup.okhttp.internal.http.Http2xStream.writeRequestHeaders(Http2xStream.java:135) at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:710) at com.facebook.stetho.okhttp.StethoInterceptor.intercept(StethoInterceptor.java:67) at com.squareup.okhttp.internal.http.HttpEngine$NetworkInterceptorChain.proceed(HttpEngine.java:695) at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:576) at com.squareup.okhttp.Call.getResponse(Call.java:287) at com.squareup.okhttp.Call$ApplicationInterceptorChain.proceed(Call.java:243) at com.squareup.okhttp.Call.getResponseWithInterceptorChain(Call.java:205) at com.squareup.okhttp.Call.execute(Call.java:80) at com.newrelic.agent.android.instrumentation.okhttp2.CallExtension.execute(CallExtension.java:43) at retrofit.client.OkClient.execute(OkClient.java:53) at com.newrelic.agent.android.instrumentation.retrofit.ClientExtension.execute(ClientExtension.java:42) […]

有时从后台返回到应用程序,单身保存的静态数据为空

我使用经典的单例模式来存储从我的初始活动(splash活动)中的webServices获得的数据,然后在整个应用程序中访问它。 我有一个导致MainActivity的splash活动,它是里面有片段的滑动菜单活动,最初的片段是一个包含支持映射片段的片段。 我的问题是存储在单身人士内部的数据,有时当应用程序转到后台(按住home并移动到另一个应用程序),然后转到最近的应用程序并select我的应用程序,单身人士的数据是空的,这会导致我的应用程序崩溃。 我已经花了几个小时检查我的单例是否应该写入,如果我没有把它自己写成null,那么静态数据变成null的可能原因是什么。 在我的search后,我发现了一个很好的和简单的解释,解释何时/为什么一个静态数据可以成为null – Android静态对象生命周期 @Samuh答案和我引用 “所以,如果你创build一个android应用程序并初始化一个静态variables,它将一直保留在JVM中,直到发生以下情况之一:1.类被卸载2. JVMclosures3.进程死亡” 关于#1和#2 – 我不知道什么时候发生。 关于#3 – 这是非常好的,好像用户将从“最近的应用程序”中点击我的应用程序,这将调用启动器活动在我的情况下“飞溅的活动”,这将从服务器获取数据(最新),再次存储在我的单身 – 完美! ,这正是我的其他应用程序内发生的,不同的是我没有使用滑动菜单和片段,只有活动。 在我的情况下,从后台返回将不会调用启动器活动这是“闪屏”,但将调用MainActivity(主滑动菜单活动)连同初始片段,当我尝试从我的单身访问数据所有数据里面它是空的,单身本身不是null,因为在片段的onCreate()我使用getInstance()我相信这意味着单身已经丢失,现在重新创build没有数据,所以如果过程是为什么我没有回到发射器的活动? 希望有人能提前帮助,谢谢。 我的单身class: public class MySingleton { // some private data members with getters/setters private String x,y,z; // the instance private static MySingleton theInstance = null; //private ctor private MySingleton(){ //doing something } //get instance public […]

多个活动/片段和模型视图演示者模式

首先,我知道使用Model View Presenter有不同的实现,在我的脑海里,只要你具有明确定义的层次和完成他们的指定angular色,那么你如何实现这个模式是可以解释的。 我已经在只有一个Activity很多应用程序中实现了这个模式。 我现在开始了一个新的项目,它有多个活动和附加Fragments ,包括嵌套片段( ViewPager )。 我现在正在试图把MVP翻译成这个项目,我打了一个概念墙,想要一些指导和见解。 到目前为止,我已经创build了上述结构,并开始与View&Presenter(不pipeActivity或Fragment )进行1:1的关系。 我觉得这是好的,但是如果我举个例子,我发送了一个请求,从Activity视图到它的Presenter,这个Activity视图返回一个结果,我将如何去传播结果,即更新所有其他Activities / Fragments当前不处于Paused()或Stop()状态。 我觉得在这种情况下,应该有一个中央主持人,更新所有必要的活动和片段的意见,但我不知道如何去做这件事。 当前,当创build每个Activity和Fragment ,它将创build一个Presenter类的新实例,将其作为参考传递(Activities和Fragments实现自己的接口),演示者将其存储为WeakReference并可以在调用相关接口方法返回结果。 根据文档,每当Fragments想互相沟通和附加的Activity你应该使用callback接口。 考虑到这一点,我应该有一个Activity实现的callback接口和Fragmentscallback函数来实现请求,所以实际上只有Activity会有一个Presenter和Model层,Fragments必须callback才能发出各种请求? 对不起,如果这听起来有点混乱,希望这是明确的,以了解我想达到什么目的,如果我正在思考沿着正确的路线……或完全离谱!

从活动中解耦应用内帐单

我可以在Android In-App-Billing V3中find的所有教程都假定您有一个单独的活动来处理与计费相关的所有事宜。 在我的情况下,有多个活动需要访问帐单。 我将如何处理这样一个最优雅的东西? 我偶然发现的一个示例问题:在使用Google结算助手类时,您总是将当前活动作为参数进行交付。 稍后的callback(例如onActivityResult)在该活动上被调用。 但是,如果主动活动一直改变呢? 我是否必须始终closures并重新初始化结算?

如何在Android Webview中停止Javascript执行

情景:我有一个包含WebView的活动。 每当我开始这个活动时,一些HTML内容就会在WebView中呈现。 我也在WebView中注入Javascript,它包含一些代码,包括DomContentLoaded事件监听器。 问题:问题在于有时Javascript在WebView中执行的时间很长。 这种情况不是每次都随机发生。 大多数时候它加载速度非常快。 但有时对于相同的内容,执行需要20秒以上。 现在在这个状态下,如果我从活动中返回并重新启动它,那么JavaScript将不会在WebView中加载,因为之前的JS执行尚未完成。 我必须杀死该应用程序,并重新启动,以使WebView的工作。 如何从这个状态中恢复而不杀死应用程序? 我试图阻止它使用下面的代码,但没有一个工作。 还有其他build议吗? webView.stopLoading(); webView.loadData("", "text/html", null); webView.freeMemory(); webView.removeAllViews(); webView.destroy();

在存在startActivityForResult调用的情况下进行Android程序stream控制

有问题的程序在Android上运行时控制从属蓝牙(BT)设备。 它具有很less的button,可以启用对等设备的不同function。 在Android设备上,默认情况下,蓝牙没有启用,点击button后短时间build立连接。 所以,点击每个button之后的stream程是: 确保BT启用( startActivityForResult()与BT启用意图,如果没有) 连接到远程设备 启用远程设备的某些function 与设备断开连接 我的问题是,如果没有启用BT,则在#1中对startActivityForResult()的调用会“中断”程序stream程。 后来,当onActivityResult()被调用时,我想从它被“分解”的地方恢复stream。 为此,我定义了额外的成员字段和很less的常量,并在onActivityResult()使用它们: private int mRerunMethodIndex = 0; private static final int RERUN_METHOD1 = 1; private static final inr RERUN_METHOD2 = 2; … public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_ENABLE_BT: if (resultCode == Activity.RESULT_OK) { int rerunMethodIndex = mRerunMethodIndex; […]